connect_by_IsLeaf,connect_by_rootを使ったOracleの階層問い合わせ3
山岸賢治 [著] 2009/09/28 14:00

SourceCode 0.86 KB

 Oracleの階層問い合わせについて、基本事項から使用例まで、SQLのイメージを交えて解説します。本稿では、connect_by_IsLeaf疑似列、connect_by_root演算子、prior演算子を扱います。

1 2 3 →

はじめに

 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となります。サンプルを見てみましょう。

IsLeafT
IDOyaID
1null
21
32
41
54
64
71
10null
20null
2120
2221
connect_by_IsLeafの使用例
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;
出力結果
IDOyaIDLevelisLeafpath
1null10,1
2120,1,2
3231,1,2,3
4120,1,4
5431,1,4,5
6431,1,4,6
7121,1,7
10null11,10
20null10,20
212020,20,21
222131,20,21,22

 connect_by_IsLeaf疑似列のイメージは、下記となります。木ごとに区切る赤線をイメージして、葉であるノードに緑色を塗ってます。

connect_by_IsLeaf擬似列のイメージ
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;
出力結果
IDOyaIDLevelpath
323,1,2,3
543,1,4,5
643,1,4,6
712,1,7
10null1,10
22213,20,21,22

1 2 3
→
INDEX
Oracleの階層問い合わせ(3) (connect_by_IsLeaf,connect_by_root)
Page1
はじめに
対象読者
必要な環境
1. connect_by_IsLeaf疑似列
2. connect_by_root演算子
3. prior演算子
最後に
参考資料
プロフィール
山岸賢治 ヤマギシケンジ

Oracle ACEの1人。
OracleSQLパズルの運営者。
ORACLE MASTER Silver Oracle Database 10g
(研修受講で)ORACLE MASTER Gold Oracle Database 10g
ソフトウェア開発技術者 (情報処理技術者試験)
第二種情報処理技術者 (情報処理技術者試験)
 


記事へのコメント・トラックバック機能は2011年6月に廃止させていただきました。記事に対する反響はTwitterやFacebook、ソーシャルブックマークサービスのコメントなどでぜひお寄せください。

スポンサーサイト