SHOEISHA iD

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

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

Oracleの階層問い合わせ

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

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

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

ダウンロード 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の公式マニュアルの階層問い合わせに関する部分です。(英語)

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

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

もっと読む

この記事の著者

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

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

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

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

この記事をシェア

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

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング