- ベストアンサー
PostgresSQL8.4でツリー上にデータを取得したい
- PostgresSQL8.4を使用して、親子構造のデータをツリー上で取得する方法を教えてください。
- 再起SQLや相関サブクエリを使用してデータを取得する方法を教えてください。
- 画像の「取得したい順番」通りにデータを取得する方法を教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#1 です。 余計なお世話かもしれませんが、親子関係で階層的にデータを持たせるのは、主たる要素の意味合いの粒度が同じ場合の方が好ましいです。 例えば、前便のサンプルで頻出する社員テーブルの場合、主キーは社員ID、エンティティの意味する粒度は親でも子でも変わらない「社員」です。 ご質問の場合、アジア→日本→東京(地域→国名→地名)のように粒度が荒いので、マスタとして今後、使いにくくなっていく可能性があります。 既に設計済みでもう変えられないなら、仕方ありませんが。 また、単純に地名マスタ程度の意味合いしかないのであれば、今のままでも問題無いと思います。
その他の回答 (2)
- pdragon
- ベストアンサー率35% (5/14)
http://oraclesqlpuzzle.hp.infoseek.co.jp/postgresql-rec-with.html#1-5 こちらを参考にさせて頂きました。 --- with recursive rec(id, name, parent, path) as( select id, name, parent, array[id] from testtable where parent = 0 union all select b.id, b.name, b.parent, a.path || b.id from rec a Join testtable b on a.id = b.parent) select id, name, parent, path, array_upper(path, 1) as LV from rec order by path; --- PostgreSQL9.0.1で試したところ、ご要望どおりの結果を取得できました。
お礼
回答が遅くなり申し訳ございません。 試してみましたところ、無事にデータの取得ができました。 ありがとうございました。
- utakataXEX
- ベストアンサー率69% (711/1018)
ORACLEだったら、CONNECT BYを使った階層問合せを使って楽勝にできる部分ですが、PostgreSQLでも階層問合せの機能を使用する事が可能です。 (標準では実装されません) このような場合、connectby() を使います。 以下を参考にしてください。 ↓ [ThinkIT] 第5回:SQL文の移行(2) (1/2) http://thinkit.co.jp/free/marugoto/2/1/23/ PostgreSQLで階層問い合わせ(CONNECT BY)を使用する http://ameblo.jp/b-nobu/entry-10029509981.html PostgreSQLで階層問い合わせ(CONNECT BY)を使用する(その2) http://ameblo.jp/b-nobu/entry-10030757897.html PostgreSQL 階層問合せ でググれば沢山サンプルが引っかかると思います。
お礼
ご回答ありがとうございます。 早速参考に試させて頂きます。
お礼
ご回答ありがとうございます。 質問であげさせて頂いているのは、質問用&SQLの作成用で作ったデータです。 しかし実際のデータも粒度は荒いです・・・。こちらはすでに設計済みになっている点とある程度使用されてる為に変更することができません。 マスタについては少々懸念しています。 質問に答えて頂けるだけでなく、ご親切に懸念事項まで指摘して頂き大変ありがたく思います。 ありがとうございます。