はじめに
Oracleの階層問い合わせについて、基本事項から使用例まで、SQLのイメージを交えて解説します。本稿では、connect_by_IsLeaf
疑似列、connect_by_root
演算子、prior
演算子を扱います。
対象読者
- Oracleの階層問い合わせを使いたい方
- OracleのSQLの理解を深めたい方
必要な環境
本稿で扱うSQLは、Oracle 10.2.0.1.0で動作確認しました。
1. connect_by_IsLeaf疑似列
connect_by_IsLeaf
疑似列は、そのノードが木の葉であれば1、木の葉でなければ0となります。サンプルを見てみましょう。
ID | OyaID |
1 | null |
2 | 1 |
3 | 2 |
4 | 1 |
5 | 4 |
6 | 4 |
7 | 1 |
10 | null |
20 | null |
21 | 20 |
22 | 21 |
select ID,OyaID,Level,connect_by_IsLeaf as isLeaf, sys_connect_by_path(to_char(ID),',') as path from IsLeafT start with OyaID is null connect by prior ID = OyaID;
ID | OyaID | Level | isLeaf | path |
1 | null | 1 | 0 | ,1 |
2 | 1 | 2 | 0 | ,1,2 |
3 | 2 | 3 | 1 | ,1,2,3 |
4 | 1 | 2 | 0 | ,1,4 |
5 | 4 | 3 | 1 | ,1,4,5 |
6 | 4 | 3 | 1 | ,1,4,6 |
7 | 1 | 2 | 1 | ,1,7 |
10 | null | 1 | 1 | ,10 |
20 | null | 1 | 0 | ,20 |
21 | 20 | 2 | 0 | ,20,21 |
22 | 21 | 3 | 1 | ,20,21,22 |
connect_by_IsLeaf
疑似列のイメージは、下記となります。木ごとに区切る赤線をイメージして、葉であるノードに緑色を塗ってます。
connect_by_IsLeaf
疑似列の使用例としては、下記のSQLのように、where
句で、connect_by_IsLeaf = 1
を指定して、木の葉である行のみを取得することが多いです。
select ID,OyaID,Level,sys_connect_by_path(to_char(ID),',') as path from IsLeafT where connect_by_IsLeaf = 1 start with OyaID is null connect by prior ID = OyaID;
ID | OyaID | Level | path |
3 | 2 | 3 | ,1,2,3 |
5 | 4 | 3 | ,1,4,5 |
6 | 4 | 3 | ,1,4,6 |
7 | 1 | 2 | ,1,7 |
10 | null | 1 | ,10 |
22 | 21 | 3 | ,20,21,22 |