SQL階層問い合わせではconnect句で複数条件を指定することが可能です。
SQL> select * from t2;
ID SEQ
---------- ----------
1 1
1 2
1 3
3 1
4 1
4 3
5 1
5 2
5 3
9行が選択されました。
上記のようなテーブルがあったとします。
SQL> select ID,Seq,Level
2 from t2
3 start with Seq = 1
4 connect by prior ID = ID
5 and prior Seq = Seq - 1;
ID SEQ LEVEL
---------- ---------- ----------
1 1 1
1 2 2
1 3 3
3 1 1
4 1 1
5 1 1
5 2 2
5 3 3
8行が選択されました。
「start with Seq = 1」はSeq=1の列が親になります。
connect byに一つ目の条件「prior ID = ID」ではIDが一致する場合、
なおかつ二つ目の条件「Seq = Seq - 1」はSeqの差が1の場合、親子関係が成立します。
さらにstart with句を省略することも可能です。
この場合、全ての列が親になります。
SQL> select * from t3;
VAL
----------
1
2
3
4
5
上記のような列があったとします。
select Val,Level,
sys_connect_by_path(to_char(Val),',') as Path
from t3
connect by prior Val = Val - 1;
VAL LEVEL PATH
---------- ---------- ----------
1 1 ,1
2 2 ,1,2
3 3 ,1,2,3
4 4 ,1,2,3,4
5 5 ,1,2,3,4,5
2 1 ,2
3 2 ,2,3
4 3 ,2,3,4
5 4 ,2,3,4,5
3 1 ,3
4 2 ,3,4
VAL LEVEL PATH
---------- ---------- ----------
5 3 ,3,4,5
4 1 ,4
5 2 ,4,5
5 1 ,5
15行が選択されました。
「connect by prior Val = Val - 1;」でValの差が1の場合に親子関係を結びます。
なお、sys_connect_by_pathでは親にたどり着くまでのパスを表示することが出来ます。
SQL> select * from t2;
ID SEQ
---------- ----------
1 1
1 2
1 3
3 1
4 1
4 3
5 1
5 2
5 3
9行が選択されました。
上記のようなテーブルがあったとします。
SQL> select ID,Seq,Level
2 from t2
3 start with Seq = 1
4 connect by prior ID = ID
5 and prior Seq = Seq - 1;
ID SEQ LEVEL
---------- ---------- ----------
1 1 1
1 2 2
1 3 3
3 1 1
4 1 1
5 1 1
5 2 2
5 3 3
8行が選択されました。
「start with Seq = 1」はSeq=1の列が親になります。
connect byに一つ目の条件「prior ID = ID」ではIDが一致する場合、
なおかつ二つ目の条件「Seq = Seq - 1」はSeqの差が1の場合、親子関係が成立します。
さらにstart with句を省略することも可能です。
この場合、全ての列が親になります。
SQL> select * from t3;
VAL
----------
1
2
3
4
5
上記のような列があったとします。
select Val,Level,
sys_connect_by_path(to_char(Val),',') as Path
from t3
connect by prior Val = Val - 1;
VAL LEVEL PATH
---------- ---------- ----------
1 1 ,1
2 2 ,1,2
3 3 ,1,2,3
4 4 ,1,2,3,4
5 5 ,1,2,3,4,5
2 1 ,2
3 2 ,2,3
4 3 ,2,3,4
5 4 ,2,3,4,5
3 1 ,3
4 2 ,3,4
VAL LEVEL PATH
---------- ---------- ----------
5 3 ,3,4,5
4 1 ,4
5 2 ,4,5
5 1 ,5
15行が選択されました。
「connect by prior Val = Val - 1;」でValの差が1の場合に親子関係を結びます。
なお、sys_connect_by_pathでは親にたどり着くまでのパスを表示することが出来ます。

コメント