第5回:SQL文の移行(2) (1/2)

まるごと PostgreSQL!
PostgreSQLとOracleによるデータベース相互移行マニュアル

第5回:SQL文の移行(2)
著者:奥畑 裕樹(OKUHATA, Hiroki)   2005/11/4
1   2  次のページ
階層問い合わせ

   Oracleの階層問い合わせをPostgreSQLで実現するには、connectby()を使います。

   図8のような表があったとしましょう。担当者マスタのMGR_ID列は、各行の担当者にとって、上司となる担当者のIDを表しています。
SQL> SELECT * FROM 担当者マスタ;
  
担当者ID  担当者名  ふりがな MGR_ID   生年月日 性別
--------  -----------------   -----------------  --------   --------  ------
鈴木  すずき    60-01-23 1
小野  おの    60-08-02 1
斎藤  さいとう    63-10-15 1
藤本  ふじもと  72-07-18 1
小林  こばやし  71-02-11 0
伊藤  いとう  72-04-01 0
佐瀬  させ  75-02-21 1
宇賀神  うがじん  75-12-22 1
岡田  おかだ  72-03-18 1
 
9行が選択されました

図8:担当者マスタ表

   Oracleには、図8のような階層的な構造を含んだテーブルがあるときに、1つのSELECT文で図9のような出力を得ることができる「階層問い合わせ」という便利な機能があります。

担当者(階層表示)
-------------------
鈴木
  宇賀神
小野
  伊藤
  佐瀬
斎藤
  藤本
   岡田
  小林

9行が選択されました。

図9:Oracleでの階層問い合わせの結果

   階層問い合わせは、指定された条件に従って、階層上の親から子へと段階的に該当行を検索します。図9の出力を得るためのSELECT文は次のとおりです。START WITH句で階層問い合わせを開始するスタート行を指定し、CONNECT BY句で階層的に子となる行を指定します。

SELECT LPAD(' ', (LEVEL-1)*2) ||
         担当者名"担当者(階層表示)"
   FROM 担当者マスタ
   START WITH MGR_ID IS NULL
   CONNECT BY PRIOR 担当者ID = MGR_ID;
   PostgreSQL単体には階層問い合わせの機能はありませんが、ソースコード配布パッケージのcontrib/tablefuncフォルダに、同等の機能を持つconnectby()関数が用意されています。

1   2  次のページ

書籍紹介
まるごと PostgreSQL! Vol.1
まるごと PostgreSQL! Vol.1 日本での市場シェアNo.1(オープンソースRDBMS部門)データベースソフトPostgreSQLの最新情報を、開発メンバーを含む豪華執筆陣が多面的かつ詳細に解説します。PostgreSQL用クラスタリング/レプリケーションソフト、PostgreSQL⇔Oracle移行、PostgreSQLによる大規模サイト構築法、新バージョンPostgreSQL 8.0先行レビュー、PostgreSQL用.NETデータプロバイダ等々、他では読めない貴重な記事が満載です。

発売日:2004/12/08発売
定価:\1,890(本体 \1,800+税)
奥畑 裕樹(OKUHATA, Hiroki)
著者プロフィール
奥畑 裕樹(OKUHATA, Hiroki)
Javaとオープンソース技術を得意とする技術コンサルタント。最近のテーマは、ソフトウェア開発の全体最適をはかること。気が付けば、10才のときにプログラミングを始めて以来、常に何かを作っている…。


INDEX
第5回:SQL文の移行(2)
階層問い合わせ
  connectby()関数の使い方
PostgreSQLとOracleによるデータベース相互移行マニュアル
第1回 データベース移行
第2回 データの移行(1)
第3回 データの移行(2)
第4回 SQL文の移行(1)
第5回 SQL文の移行(2)
第6回 SSQL文の移行(3)
第7回 ファンクションの移行(1)
第8回 ファンクションの移行(2)
第9回 ストアドプロシージャの移行(1)
第10回 ストアドプロシージャの移行(2)
第11回 ストアドプロシージャの移行(3)
第12回 ストアドプロシージャの移行(4)
第13回 まとめ

人気記事トップ10

人気記事ランキングをもっと見る