5

私は2つのテーブルAとBを持っています: A (id, dep_id)そしてB (id, amount)

これらのテーブルのデータは次のようになります

A                 B

id  dep_id        id   amount
--- -------       ---- --------
1   2             1    100    
2   3             2    200
3   NULL          3    300   
4   NULL          4    400

テーブル Aのid列は、テーブル B を保持idします。テーブル A の特定の に対して、テーブル Bを保持するidが存在する場合があります。dep_idid

要件は、B のエントリとそのすべての依存エントリの金額の合計を計算することです。これは、単一の SQL クエリで実行する必要があります。そのためにPL/SQLブロックを使用できません。それを行う方法はありますか。

例:

sum(id=1) = 100(id=1,dep_id=2) + 200(id=2,dep_id=3) + 300(id=3) = 600
4

5 に答える 5

5

CONNECT BY ROOT依存関係のリンク (階層クエリ) を構築するために使用してから、以下を集約できます。

SQL> SELECT ID, SUM(amount)
  2    FROM (SELECT connect_by_root(a.id) ID, b.amount
  3            FROM a
  4            JOIN b ON a.id = b.id
  5           START WITH a.ID = 1
  6           CONNECT BY PRIOR a.dep_id = a.ID)
  7   GROUP BY ID;

        ID SUM(AMOUNT)
---------- -----------
         1         600

この SQL quiz on plsqlchallenge では、類似しているが少し複雑なスキーマ (たとえば、それぞれ8x がid:1必要な 4xが必要) で追加のソリューションを利用できます。id:2id:3

于 2013-05-14T14:23:21.247 に答える
3

Vincents のクエリの代わりに、次を使用できます。

select sum(b.amount) 
from B b 
where b.id in (
    select a.id from A a start with a.id = 1 connect by a.id = prior a.dep_id
);

SQLFiddle: http://sqlfiddle.com/#!4/d7d1c/5

于 2013-05-14T14:29:54.243 に答える
2

再帰的な CTE を使用する別の方法:

with recur (id, dep_id, amount)as
(
  select A.id, A.dep_id, b.amount
  from A
  inner join B on A.id = b.id

  union all

  select recur.id, a.dep_id, b.amount
  from recur
  inner join A on recur.dep_id = a.id
  inner join B on a.id = b.id      
)
select id, sum(amount) 
from recur
group by id

ここで動作するフィドルを参照してください: http://sqlfiddle.com/#!4/c1c83/2

于 2013-05-14T14:37:29.940 に答える
0

再帰クエリを使用してそれを行うことができます。私はデータベースにアクセスできませんが、これは大まかなアイデアです。クエリの結果は正確に正しくない可能性があります。これは DB2 にあります。

With Ax as
(
SELECT ID, DEP_ID FROM A
UNION ALL
SELECT AX.ID, A.DEP_ID
FROM AX, A
WHERE AX.DEP_ID = A.ID
)

SELECT A.ID, SUM(AMOUNT)
FROM AX AS A JOIN B
ON A.ID = B.ID

1 の結果セットは、AX では次のようになります。

1 2
2 3
1 NULL
2 3
3 NULL
4 NULL
于 2013-05-14T14:34:51.380 に答える