2
customers:
+------------+--------------+ 
| cid        | Name         | 
+------------+--------------+ 
| 1          | Bob          |
| 2          | John         | 
| 3          | Jane         | 
+------------+--------------+ 
accounts:
+------------+--------------+ 
| aid        | type         | 
+------------+--------------+ 
| 1          | Checking     |
| 2          | Saving       | 
| 3          | CD           | 
+------------+--------------+ 
transactions:
+------------+--------------+--------------+ 
| tid        | cid          | aid          | 
+------------+--------------+--------------+ 
| 1          | 1            | 1            | 
| 2          | 2            | 1            | 
| 3          | 1            | 2            | 
| 4          | 2            | 3            | 
| 5          | 3            | 1            | 
+------------+--------------+--------------+

顧客IDをパラメータとして指定すると、顧客のID、名前、およびすべてのアカウントを表示するplsqlプロシージャを作成しようとしています。ID と名前を表示するのは簡単です。よくわからないのは、顧客 ID にリンクされているすべてのアカウントを取得する方法と、複数のアカウントを取得する方法です。

4

1 に答える 1

0

アイデアは次のとおりです。

select c.cid, c.name, a.type
from customers c
left join transactions t on (t.cid = c.cid)
left join accounts a on (a.aid = t.aid)
where c.cid = :customer_id
group by c.cid, c.name, a.type;

トランザクションが増える可能性があるため、group by が必要です。

さらに、1行を見たい場合:

select cid, name, LISTAGG(type, ',') WITHIN GROUP (ORDER BY type) as account_types
from(
    select distinct c.cid, c.name, a.type
    from customers c
    left join transactions t on (t.cid = c.cid)
    left join accounts a on (a.aid = t.aid)
    where c.cid = :customer_id

)
group by cid, name;

これをストアドプロシージャ/関数に入れるのは簡単すぎるので、お任せします。

于 2012-12-05T07:18:26.983 に答える