探索終了条件を指定して枝切り1
下記のSQLがサンプルとなります。親子条件であるprior ID = OyaID
と枝切り条件としてのprior ID not in(3,22)
をand
でつなげた論理積をconnect by
句で指定しています。これにより親子条件を満たしたとしても、親ノードのIDが3または22であるノードとその子孫は出力されなくなります。
select ID,OyaID,Level, sys_connect_by_path(to_char(ID),',') as path from edaKiri start with OyaID is null connect by prior ID = OyaID --親子条件 and prior ID not in(3,22) --枝切り条件 order by ID;
ID | OyaID | Level | path |
1 | null | 1 | ,1 |
2 | 1 | 2 | ,1,2 |
3 | 2 | 3 | ,1,2,3 |
4 | 2 | 3 | ,1,2,4 |
20 | null | 1 | ,20 |
22 | 20 | 2 | ,20,22 |
探索終了条件を指定して枝切り2
下記のSQLがサンプルとなります。親子条件であるprior ID = OyaID
と枝切り条件としてのID not in(3,22)
をand
でつなげた論理積をconnect by
句で指定しています。これにより親子条件を満たしたとしても、IDが3または22であるノードとその子孫は出力されなくなります。
select ID,OyaID,Level, sys_connect_by_path(to_char(ID),',') as path from edaKiri start with OyaID is null connect by prior ID = OyaID --親子条件 and ID not in(3,22) --枝切り条件 order by ID;
ID | OyaID | Level | path |
1 | null | 1 | ,1 |
2 | 1 | 2 | ,1,2 |
4 | 2 | 3 | ,1,2,4 |
20 | null | 1 | ,20 |
ただし、上記のようなprior
演算子を伴わない条件式をconnect by
句で記述するのであれば、下記のSQLのように、階層問い合わせの前に行を減らしておく方法を使ったほうが分かりやすいかもしれません。
select ID,OyaID,Level, sys_connect_by_path(to_char(ID),',') as path from (select ID,OyaID from edaKiri where ID not in(3,22)) start with OyaID is null connect by prior ID = OyaID --親子条件 order by ID;
select ID,OyaID,Level, sys_connect_by_path(to_char(ID),',') as path from edaKiri Join dual on ID not in(3,22) start with OyaID is null connect by prior ID = OyaID --親子条件 order by ID;
なお、上記のSQLでは、下記のOracleのselect
文の評価順序において、where句 (行のフィルタ条件)
がconnect by
句の後に実行されることを踏まえ、インラインビューを使ったり、dualと内部結合させています。
1. from句 2. where句 (結合条件) 3. start with句 4. connect by句 5. where句 (行のフィルタ条件) 6. group by句 7. having句 8. model句 9. select句 10. union、minus、intersectなどの集合演算 11. order by句