SHOEISHA iD

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

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

Oracleの階層問い合わせ

Oracleの階層問い合わせ(1)
(start with句、connect by句)

start with句、connect by句を使ったOracleの階層問い合わせ1

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

ダウンロード SourceCode (819.0 B)

2. connect by句で複数条件

 connect by句で複数の条件を指定できます。サンプルを見てみましょう。

SeqT
ID Seq
1 1
1 2
1 3
3 1
4 1
4 3
5 1
5 2
5 3

 Seq = 1の行を木の根とし、親子関係の条件を、同じIDで、子のSeqが親より1大きいこととして、階層問い合わせを行います。

connect by句で複数条件
select ID,Seq,Level
  from SeqT
start with Seq = 1
connect by prior ID  = ID
       and prior Seq = Seq-1;
出力結果
ID Seq Level
1 1 1
1 2 2
1 3 3
3 1 1
4 1 1
5 1 1
5 2 2
5 3 3

 解説すると、start with句で、木の根となる条件を指定します。Seq = 1を満たす行が、木の根となります。start with句の段階での、SQLのイメージは下記となります。

start with句の段階でのイメージ
start with句の段階でのイメージ

 そして、connect by句で指定した、下記の親子関係の条件を満たせば親子関係があると判定されます。

親子関係の条件
    prior ID = ID
and prior Seq = Seq-1

 SQLのイメージは下記となります。connect by句にprior ID = IDがありますので、IDごとに区切る赤線をイメージしてます。

SQLのイメージ
SQLのイメージ

3. start with句の省略

 start with句を省略して階層問い合わせを行うことができます。サンプルを見てみましょう。

ValT
Val
1
2
3
4
5
start with句の省略
select Val,Level,
sys_connect_by_path(to_char(Val),',') as Path
  from ValT
connect by prior Val = Val-1;
出力結果
Val Level Path
1 1 ,1
2 2 ,1,2
3 3 ,1,2,3
4 4 ,1,2,3,4
5 5 ,1,2,3,4,5
2 1 ,2
3 2 ,2,3
4 3 ,2,3,4
5 4 ,2,3,4,5
3 1 ,3
4 2 ,3,4
5 3 ,3,4,5
4 1 ,4
5 2 ,4,5
5 1 ,5

 解説すると、start with句が省略されているので、すべての行が、木の根となります。start with句の段階での、SQLのイメージは下記となります。

start with句の段階でのイメージ
start with句の段階でのイメージ

 そして、connect by句で指定した、prior Val = Val-1を満たせば親子関係があると判定されます。

 select句でsys_connect_by_path関数を使って、根からの経路を表示してます。SQLのイメージは下記となります。木ごとに区切る赤線をイメージしてます。

SQLのイメージ
SQLのイメージ

最後に

 今回は、start with句、connect by句を扱いました。次回は、Level擬似列、sys_connect_by_path関数、order siblings byを扱います。

参考資料

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

  3. Oracle Database SQL Reference 10g Release2 Hierarchical Queries
  4.  Oracleの公式マニュアルの階層問い合わせに関する部分です(英語)。

  5. SYS_CONNECT_BY_PATH
  6.  Oracleの公式マニュアルのsys_connect_by_path関数に関する部分です(日本語)。

  7. SYS_CONNECT_BY_PATH
  8.  Oracleの公式マニュアルのsys_connect_by_path関数に関する部分です(英語)。

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

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

もっと読む

この記事の著者

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

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

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

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

この記事をシェア

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

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング