SHOEISHA iD

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

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

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

Oracleの階層問い合わせ

Oracleの階層問い合わせ(4)
(connect by nocycle)

有向グラフ、無向グラフへの階層問い合わせ

ダウンロード SourceCode (959.0 B)

2. connect_by_IsCycle疑似列

 前問より複雑な有向グラフで、connect_by_IsCycle疑似列を使ったサンプルです。

RosenMap2
ID NextID1 NextID2
1 2 3
2 4 5
3 4 null
4 2 6
5 6 null
6 null null

 (親の行の)NextID1 = (子の行の)ID または、(親の行の)NextID2 = (子の行の)ID を親子条件として、(同じノードへ再訪問しない)各ノードまでの経路を列挙してみます。

複雑な有向グラフでのサンプル
select ID,Level,sys_connect_by_path(to_char(ID),'-') as path,
connect_by_IsCycle as IsCycle
  from RosenMap2
start with ID = 1
connect by nocycle ID in(prior NextID1,prior NextID2)
order by ID,path;
出力結果
ID Level path IsCycle
1 1 -1 0
2 2 -1-2 0
2 4 -1-3-4-2 1
3 2 -1-3 0
4 3 -1-2-4 1
4 3 -1-3-4 0
5 3 -1-2-5 0
5 5 -1-3-4-2-5 0
6 4 -1-2-4-6 0
6 4 -1-2-5-6 0
6 6 -1-3-4-2-5-6 0
6 4 -1-3-4-6 0

 上記の結果から、connect_by_IsCycle疑似列は、経路上で訪問済であるノードを子供に持てば1、そうでなければ0となることが確認できます。下記のような有向グラフの絵を描いてみると、分かりやすいでしょう。

有向グラフの絵
有向グラフの絵

最後に

 今回は、connect by nocycleconnect_by_IsCycle擬似列を扱いました。次回からは、階層問い合わせの使用例を、紹介していきます。

参考資料

  1. Oracle Database SQLリファレンス 10g リリース2 階層問合せ
  2. Oracleの公式マニュアルの階層問い合わせに関する部分です。(日本語)
  3. Oracle Database SQL Reference 10g Release2 Hierarchical Queries
  4. Oracleの公式マニュアルの階層問い合わせに関する部分です。(英語)

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

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
Oracleの階層問い合わせ連載記事一覧

もっと読む

この記事の著者

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

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

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

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

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/2691 2009/11/10 14:00

イベント

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

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

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

メールバックナンバー