SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Oracleの階層問い合わせ

Oracleの階層問い合わせ(6)
(枝切りの入門事項)

有向グラフで訪問経路の列挙

  • X ポスト
  • このエントリーをはてなブックマークに追加

ダウンロード SourceCode (1.2 KB)

探索終了条件を指定して枝切り1

 下記のSQLがサンプルとなります。親子条件であるprior ID = OyaIDと枝切り条件としてのprior ID not in(3,22)andでつなげた論理積をconnect by句で指定しています。これにより親子条件を満たしたとしても、親ノードのIDが3または22であるノードとその子孫は出力されなくなります。

探索終了条件を指定して枝切り1
select ID,OyaID,Level,
sys_connect_by_path(to_char(ID),',') as path
  from edaKiri
start with OyaID is null
connect by prior ID = OyaID --親子条件
       and prior ID not in(3,22) --枝切り条件
order by ID;
出力結果
ID OyaID Level path
1 null 1 ,1
2 1 2 ,1,2
3 2 3 ,1,2,3
4 2 3 ,1,2,4
20 null 1 ,20
22 20 2 ,20,22

探索終了条件を指定して枝切り2

 下記のSQLがサンプルとなります。親子条件であるprior ID = OyaIDと枝切り条件としてのID not in(3,22)andでつなげた論理積をconnect by句で指定しています。これにより親子条件を満たしたとしても、IDが3または22であるノードとその子孫は出力されなくなります。

探索終了条件を指定して枝切り2
select ID,OyaID,Level,
sys_connect_by_path(to_char(ID),',') as path
  from edaKiri
start with OyaID is null
connect by prior ID = OyaID --親子条件
       and ID not in(3,22)  --枝切り条件
order by ID;
出力結果
ID OyaID Level path
1 null 1 ,1
2 1 2 ,1,2
4 2 3 ,1,2,4
20 null 1 ,20

 ただし、上記のようなprior演算子を伴わない条件式をconnect by句で記述するのであれば、下記のSQLのように、階層問い合わせの前に行を減らしておく方法を使ったほうが分かりやすいかもしれません。

事前にwhere句で行を減らしておく方法
select ID,OyaID,Level,
sys_connect_by_path(to_char(ID),',') as path
  from (select ID,OyaID
          from edaKiri
         where ID not in(3,22))
start with OyaID is null
connect by prior ID = OyaID --親子条件
order by ID;
事前に内部結合で行を減らしておく方法
select ID,OyaID,Level,
sys_connect_by_path(to_char(ID),',') as path
  from edaKiri Join dual
    on ID not in(3,22)
start with OyaID is null
connect by prior ID = OyaID --親子条件
order by ID;

 なお、上記のSQLでは、下記のOracleのselect文の評価順序において、where句 (行のフィルタ条件)connect by句の後に実行されることを踏まえ、インラインビューを使ったり、dualと内部結合させています。

select文の評価順序
 1. from句
 2. where句 (結合条件)
 3. start with句
 4. connect by句
 5. where句 (行のフィルタ条件)
 6. group by句
 7. having句
 8. model句
 9. select句
10. union、minus、intersectなどの集合演算
11. order by句

次のページ
階層問い合わせでの枝切り

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Oracleの階層問い合わせ連載記事一覧

もっと読む

この記事の著者

山岸 賢治(ヤマギシ ケンジ)

趣味が競技プログラミングなWebエンジニアで、OracleSQLパズルの運営者。AtCoderの最高レーティングは1204(水色)。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/4809 2010/02/22 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング