oracleの階層問い合わせではテーブルの木構造を意識した問い合わせを行なうことが出来ます。
言葉では伝えづらいので、まずはテストしてみましょう。
SQL> select * from t1;
ID OYAID
---------- ----------
1
2 1
3 2
4 3
5 1
6 5
7 2
20
21 20
22 21
10行が選択されました。
上記のようなIdとOyaIdで構成されたテーブルがあります。
ある行のIDと、ある行のOyaIDが一致する場合は親子関係を結ぶものとします。
SQL> select ID,OyaID,Level
2 from t1
3 start with OyaID is null
4 connect by prior ID = OyaID;
ID OYAID LEVEL
---------- ---------- ----------
1 1
2 1 2
3 2 3
4 3 4
7 2 3
5 1 2
6 5 3
20 1
21 20 2
22 21 3
10行が選択されました。
「start with OyaID is null」よりOyaIDがnullの行は親のいない行、木構造の根っこの部分、一番てっぺんの行になります。
「connect by prior ID = OyaID」より親のIDと子のOyaIDが一致する場合は親子関係を結ぶものとします。
さらにlevelというのは疑似列で、木構造の何段目にいるかを表します。
例えば一番てっぺんの親はlevel=1、その親の子はlevel=2、さらにその親の子の子はlevel=3と言ったふうになります。
言葉では伝えづらいので、まずはテストしてみましょう。
SQL> select * from t1;
ID OYAID
---------- ----------
1
2 1
3 2
4 3
5 1
6 5
7 2
20
21 20
22 21
10行が選択されました。
上記のようなIdとOyaIdで構成されたテーブルがあります。
ある行のIDと、ある行のOyaIDが一致する場合は親子関係を結ぶものとします。
SQL> select ID,OyaID,Level
2 from t1
3 start with OyaID is null
4 connect by prior ID = OyaID;
ID OYAID LEVEL
---------- ---------- ----------
1 1
2 1 2
3 2 3
4 3 4
7 2 3
5 1 2
6 5 3
20 1
21 20 2
22 21 3
10行が選択されました。
「start with OyaID is null」よりOyaIDがnullの行は親のいない行、木構造の根っこの部分、一番てっぺんの行になります。
「connect by prior ID = OyaID」より親のIDと子のOyaIDが一致する場合は親子関係を結ぶものとします。
さらにlevelというのは疑似列で、木構造の何段目にいるかを表します。
例えば一番てっぺんの親はlevel=1、その親の子はlevel=2、さらにその親の子の子はlevel=3と言ったふうになります。

