[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 メーリングリストの案内