[pgsql-jp: 25160] Re: 親子関係をSELECT する
sugita @ sra.co.jp
sugita @ sra.co.jp
2002年 3月 8日 (金) 16:22:20 JST
杉田です。
From: Kenji Ono <ono @ fjct.fujitsu.com>
Subject: [pgsql-jp: 25158] 親子関係をSELECT する
Date: Fri, 8 Mar 2002 15:57:08 +0900
;;; 小野といいます。
;;;
;;; 環境
;;; ・DB:PostgreSQL7.1.3
;;; ・OS:RedHat7.1
;;; ・Web:Apache1.3.22
;;; ・その他:PHP3.0.18
;;;
;;; 現在、階層付けされたデータの表示で頭を悩ませております。
;;;
;;; データの登録内容
;;; ・A001
;;; └A001-01
;;; |└A001-01-01
;;; | └A001-01-01-01
;;; └A001-02
;;;
;;; Create table eqt_node (
;;; i_node char(8) , // 元コード
;;; i_prnt_node_cd char(8) // 親コード
;;; ) ;
;;;
;;; このような時、親子関係でSELECTするにはどのようにしたら良いので
;;; しょうか。
;;;
;;; Oracle君の場合は、以下のような感じですむのですが・・・。
;;; SELECT *
;;; FROM eqt_node
;;; START WITH i_node =1
;;; CONNECT BY PRIOR i_prnt_node_cd = i_node ;
;;; PostgreSQLで実行するとQueryErrorになります。
START WITH .. CONNECT BY PRIOR は、Oracle の拡張機能だからです。
;;; 期待する結果は、データ
;;; A001〜A001-01-01-01までが抽出できること。
いくつか方法があります。
その 1)
次の本に木探索の例が詳しく解説されています。
ジュー・セルコ、プログラマのための SQL、ピアソン・エデュケーション
その 2)
PostgreSQL CookBook Pages
http://www.brasileiro.net/postgres/cookbook/
Tree-structure functions
その 3)
全ノードがユニークに生成順を識別できるならば、ノードの親の生成順とノー
ドの生成順でソートすることで、幅探索の結果順で SELECT 可能です。
その 4)
7.0 か 7.2 ならば再帰的なユーザ定義関数で、Oracle と同じ順の
深さ優先行きがけ順で探索できます。
7.1 では Function Manager のバグのために再帰的な関数が使えません。
Kenji Sugita
sugita @ sra.co.jp
pgsql-jp メーリングリストの案内