2016-10-11 26 views
2

私はこのようなテーブルを持っていると言います。SQLは親のすべての子を取得し、子の値を親に追加します

ID Parent Value 
1 NULL 1000 
2 1  1000 
3 2  1000 
4 2  1000 
5 2  1000 
6 2  1000 
7 2  1000 
8 1  1000 
9 8  1000 
10 8  1000 
11 8  1000 

与えられたIDのすべての子値を再帰的に追加したいとします。正しい出力が得られます。

ID Parent Value 
1 NULL 11000 
2 1  6000 
3 2  1000 
4 2  1000 
5 2  1000 
6 2  1000 
7 2  1000 
8 1  4000 
9 8  1000 
10 8  1000 
11 8  1000 

"トップ"親が1つしかなく、親値が "Null"です。私は非常にSQLに慣れていますので、どんな種類の助けにも感謝します。私はOracle 11を使用しています。

答えて

2

はい、CONNECT_BY_ROOT演算子を使用して実行できます。

基本的に、すべての行で「START WITH」を指定すると、ルートごとに子を集計し、次にルート別にグループ化します。このように:

with test_data (id, parent, value) as ( 
SELECT 1, NULL, 1000 FROM DUAL UNION ALL 
SELECT 2, 1,  1000 FROM DUAL UNION ALL 
SELECT 3, 2,  1000 FROM DUAL UNION ALL 
SELECT 4, 2,  1000 FROM DUAL UNION ALL 
SELECT 5, 2,  1000 FROM DUAL UNION ALL 
SELECT 6, 2,  1000 FROM DUAL UNION ALL 
SELECT 7, 2,  1000 FROM DUAL UNION ALL 
SELECT 8, 1,  1000 FROM DUAL UNION ALL 
SELECT 9, 8,  1000 FROM DUAL UNION ALL 
SELECT 10, 8,  1000 FROM DUAL UNION ALL 
SELECT 11, 8,  1000 FROM DUAL) 
SELECT root_id id, root_parent parent, sum(value) value 
FROM ( 
SELECT connect_by_root(id) root_id, connect_by_root(parent) root_parent, value 
FROM test_data td 
connect by parent = prior id 
-- notice there is no "start with" clause 
) 
group by root_id, root_parent 
order by root_id 
+0

ありがとう、マシュー。それはまさに私が探していたものでした。 PL/SQLの学習に関するヒント私はデータベースを使って作業する経験はありませんし、時にはかなり混乱することもあります。 – Linuxpepe69

+0

私の答えは、実際にはPL/SQLではなくOracle SQLです。申し訳ありませんが、実際のヒントはありません。私は、Oracleのデータベース・ドキュメントが非常に良いと感じています。 docs.oracle.comから入手できる「Concepts Guide」を読んでください。 –

関連する問題