Level、sys_connect_by_pathを使ったOracleの階層問い合わせ
山岸賢治 [著] 2009/07/03 14:00

SourceCode 0.96 KB

 Oracleの階層問い合わせについて、基本事項から使用例まで、SQLのイメージを交えて解説します。本稿では、Level擬似列、sys_connect_by_path関数、order siblings byを扱います。

1 2 →

はじめに

 Oracleの階層問い合わせについて、基本事項から使用例まで、SQLのイメージを交えて解説します。本稿では、Level擬似列、sys_connect_by_path関数、order siblings byを扱います。

対象読者

  • Oracleの階層問い合わせを使いたい方
  • OracleのSQLの理解を深めたい方

必要な環境

 本稿で扱うSQLは、Oracle 10.2.0.1.0で動作確認しました。

1. Level擬似列

 Level擬似列は、ノードのレベルを表します。start with句の条件を満たしたノードのレベルが1となり、子供はレベル2、孫はレベル3といった感じでレベルが増えていきます。サンプルを見てみましょう。

LinkT
IDnextID
12
23
34
35
46
57
78
89

 IDが1の行から、親のnextID = 子のIDであることを親子条件として、階層問い合わせを行います。

Level擬似列の使用例1
select ID,nextID,Level,
sys_connect_by_path(to_char(ID),',') as Path
  from LinkT
start with ID = 1
connect by prior nextID = ID;
出力結果
IDnextIDLevelPath
121,1
232,1,2
343,1,2,3
464,1,2,3,4
353,1,2,3
574,1,2,3,5
785,1,2,3,5,7
896,1,2,3,5,7,8

 Level擬似列のイメージは、下記となります。

Level擬似列のイメージ
Level擬似列のイメージ

 もうひとつサンプルを見てみましょう。レベルの上限を3として、階層問い合わせを行った後、where句でレベルが1または3の行を抽出してます。

Level擬似列の使用例2
select ID,nextID,Level,
sys_connect_by_path(to_char(ID),',') as Path
  from LinkT
 where Level in(1,3)
start with ID = 1
connect by prior nextID = ID
       and Level <=3;
出力結果
IDnextIDLevelPath
121,1
343,1,2,3
353,1,2,3

2. sys_connect_by_path関数

 sys_connect_by_path関数は、根からの経路を表します。前問のサンプルを再度見てみましょう。

sys_connect_by_path関数の使用例
select ID,nextID,Level,
sys_connect_by_path(to_char(ID),',') as Path
  from LinkT
start with ID = 1
connect by prior nextID = ID;
出力結果
IDnextIDLevelPath
121,1
232,1,2
343,1,2,3
464,1,2,3,4
353,1,2,3
574,1,2,3,5
785,1,2,3,5,7
896,1,2,3,5,7,8

 sys_connect_by_path関数のイメージは、下記となります。

Level擬似列のイメージ
sys_connect_by_path関数のイメージ

 connect by句では、sys_connect_by_path関数を使うことはできません。

ORA-30002: ここではSYS_CONNECT_BY_PATH関数を使用できません
select ID,nextID
  from LinkT
start with ID = 1
connect by prior nextID = ID
       and instr(sys_connect_by_path(to_char(ID),','),'7') = 0;

 where句でも、sys_connect_by_path関数を使うことはできません。

ORA-30002: ここではSYS_CONNECT_BY_PATH関数を使用できません
select ID,nextID
  from LinkT
 where instr(sys_connect_by_path(to_char(ID),','),'7') = 0
start with ID = 1
connect by prior nextID = ID;

1 2
→
INDEX
Oracleの階層問い合わせ(2) (Level,sys_connect_by_path)
Page1
はじめに
対象読者
必要な環境
1. Level擬似列
2. sys_connect_by_path関数
3. order siblings by
最後に
参考資料
プロフィール
山岸賢治 ヤマギシケンジ

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


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

スポンサーサイト