[pgsql-jp: 25162] Re: 親子関係をSELECT する

Kenji Ono ono @ fjct.fujitsu.com
2002年 3月 8日 (金) 16:37:58 JST


小野です。

早速で有難うございます。

> ;;; データの登録内容
> ;;; ・A001
> ;;;  └A001-01
> ;;;  |└A001-01-01
> ;;;   |  └A001-01-01-01
> ;;;  └A001-02
> ;;; 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 の拡張機能だからです。

またか。
今までOracleべったりだったので・・・。
 
> ;;; 期待する結果は、データ
> ;;; A001〜A001-01-01-01までが抽出できること。
> 
>   いくつか方法があります。
>     その 1)
>         ジュー・セルコ、プログラマのための SQL、
>         ピアソン・エデュケーション
> 
>     その 2)
> 	PostgreSQL CookBook Pages
> 	http://www.brasileiro.net/postgres/cookbook/

本のほうは、今日本屋さんにいってみます。

>     その 3)
>         全ノードがユニークに生成順を識別できるならば、ノードの親の生成順とノー
> 	ドの生成順でソートすることで、幅探索の結果順で SELECT 可能です。

すみません。
知識が浅いので、理解できません。(^^;;
幅検索とは具体的にどのようにするのでしょうか。
 
>     その 4)
>         7.0 か 7.2 ならば再帰的なユーザ定義関数で、Oracle と同じ順の
> 	深さ優先行きがけ順で探索できます。
> 
> 	7.1 では Function Manager のバグのために再帰的な関数が使えません。

7.1なので残念です。

お手数ですが、再度よろしくお願いします。



pgsql-jp メーリングリストの案内