2. connect by句で複数条件
connect by句で複数の条件を指定できます。サンプルを見てみましょう。
| ID | Seq |
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 3 | 1 |
| 4 | 1 |
| 4 | 3 |
| 5 | 1 |
| 5 | 2 |
| 5 | 3 |
Seq = 1の行を木の根とし、親子関係の条件を、同じIDで、子のSeqが親より1大きいこととして、階層問い合わせを行います。
select ID,Seq,Level
from SeqT
start with Seq = 1
connect by prior ID = ID
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 |
解説すると、start with句で、木の根となる条件を指定します。Seq = 1を満たす行が、木の根となります。start with句の段階での、SQLのイメージは下記となります。

そして、connect by句で指定した、下記の親子関係の条件を満たせば親子関係があると判定されます。
prior ID = ID
and prior Seq = Seq-1
SQLのイメージは下記となります。connect by句にprior ID = IDがありますので、IDごとに区切る赤線をイメージしてます。

3. start with句の省略
start with句を省略して階層問い合わせを行うことができます。サンプルを見てみましょう。
| Val |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
select Val,Level, sys_connect_by_path(to_char(Val),',') as Path from ValT 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 |
| 5 | 3 | ,3,4,5 |
| 4 | 1 | ,4 |
| 5 | 2 | ,4,5 |
| 5 | 1 | ,5 |
解説すると、start with句が省略されているので、すべての行が、木の根となります。start with句の段階での、SQLのイメージは下記となります。

そして、connect by句で指定した、prior Val = Val-1を満たせば親子関係があると判定されます。
select句でsys_connect_by_path関数を使って、根からの経路を表示してます。SQLのイメージは下記となります。木ごとに区切る赤線をイメージしてます。

最後に
今回は、start with句、connect by句を扱いました。次回は、Level擬似列、sys_connect_by_path関数、order siblings byを扱います。
参考資料
- 『Oracle Database SQLリファレンス 10g リリース2 階層問合せ』
- 『Oracle Database SQL Reference 10g Release2 Hierarchical Queries』
- 『SYS_CONNECT_BY_PATH』
- 『SYS_CONNECT_BY_PATH』
Oracleの公式マニュアルの階層問い合わせに関する部分です(日本語)。
Oracleの公式マニュアルの階層問い合わせに関する部分です(英語)。
Oracleの公式マニュアルのsys_connect_by_path関数に関する部分です(日本語)。
Oracleの公式マニュアルのsys_connect_by_path関数に関する部分です(英語)。
