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
関数に関する部分です(英語)。