ダウンロード SourceCode (1.2 KB)
探索終了条件を指定して枝切り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句
この記事は参考になりましたか?
- Oracleの階層問い合わせ連載記事一覧
-
- Oracleの階層問い合わせ(7) (複雑な枝切り)
- Oracleの階層問い合わせ(6) (枝切りの入門事項)
- Oracleの階層問い合わせ(5) (ListAgg関数を模倣)
- この記事の著者
-
山岸 賢治(ヤマギシ ケンジ)
趣味が競技プログラミングなWebエンジニアで、OracleSQLパズルの運営者。AtCoderの最高レーティングは1204(水色)。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
