
PostgresSQL8.4でツリー上に取得したい
こんにちわ。
PostgresSQLでツリー上にデータを取得したいのですが、思ったように取得できないのでご教授をお願いします画像の「取得したい順番」。
データはid,name,parentとの構造になっています。
データは親子構造になっており、親の下に子が並ぶようにしたいんです。
子は親のidをparentに持っています。
元のデータは画像の「元データ」になっています。
現状再起SQLでデータを取得しid or parentでソートを掛けているのですが、意図した通りに取得できません画像の「取得出来る順番」。
そもそも再起SQLでできるのか、相関サブクエリを使うのか・・・SQLのみでできるのかすら分からなくなってきました・・・。
何か画像の「取得したい順番」通りに取得する方法はないでしょうか。
ヒントだけでもいいので、ご教授をお願いします。

No.2ベストアンサー
- 回答日時:
#1 です。
余計なお世話かもしれませんが、親子関係で階層的にデータを持たせるのは、主たる要素の意味合いの粒度が同じ場合の方が好ましいです。
例えば、前便のサンプルで頻出する社員テーブルの場合、主キーは社員ID、エンティティの意味する粒度は親でも子でも変わらない「社員」です。
ご質問の場合、アジア→日本→東京(地域→国名→地名)のように粒度が荒いので、マスタとして今後、使いにくくなっていく可能性があります。
既に設計済みでもう変えられないなら、仕方ありませんが。
また、単純に地名マスタ程度の意味合いしかないのであれば、今のままでも問題無いと思います。
ご回答ありがとうございます。
質問であげさせて頂いているのは、質問用&SQLの作成用で作ったデータです。
しかし実際のデータも粒度は荒いです・・・。こちらはすでに設計済みになっている点とある程度使用されてる為に変更することができません。
マスタについては少々懸念しています。
質問に答えて頂けるだけでなく、ご親切に懸念事項まで指摘して頂き大変ありがたく思います。
ありがとうございます。
No.3
- 回答日時:
こちらを参考にさせて頂きました。
---
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で試したところ、ご要望どおりの結果を取得できました。
参考URL:http://oraclesqlpuzzle.hp.infoseek.co.jp/postgre …
No.1
- 回答日時:
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 階層問合せ
でググれば沢山サンプルが引っかかると思います。
参考URL:http://thinkit.co.jp/free/marugoto/2/1/23/
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Oracle sqlで質問です。 idを元にidに紐付くデータで住所コードがjpのみのデータ以外のidを取得したい 4 2023/03/20 17:41
- Oracle 質問です。 下記のテーブルとデータがあり、 取得想定結果のように出力したいです。 下記のsqlだと0 2 2023/05/23 19:10
- Oracle Oracleですがsqlで質問です。 サブクエリ内で番号というカラムで昇順の1レコード目を取得したい 3 2023/05/22 10:02
- PostgreSQL 画像とカテゴリーを出力したいのですが、取得の条件を付ける方法がわかりません。 2 2022/05/01 18:03
- その他(プログラミング・Web制作) Windowsのマクロプログラムで、こんなことできますか? 3 2022/06/28 14:30
- SQL Server これをSQL文で出来るでしょうか? 1 2023/03/26 02:16
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- その他(データベース) ORMについて 1 2022/06/18 10:07
- Excel(エクセル) EXCELの外部データ取得ができない 1 2023/03/23 09:03
- Excel(エクセル) VBA : スクレイピングできない 4 2023/05/12 22:26
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
テーブルからのselectにおいて...
-
postgreSQLのint型は桁数指定が...
-
PostgressからMySQL(MariaDB)...
-
SQL文作成のお願い
-
Perl DBI でSELECT ilikeの結果...
-
データを削除しても表領域の使...
-
ORA-00959: 表領域'****'は...
-
異なるスキーマからデータを抽...
-
Viewにインデックスは張れ...
-
DELETE文でFROM句を省略した場合
-
Data Pump で大量データインポ...
-
viewのバックアップ
-
datapumpの実行方法について
-
SQL*Loaderで、データを加工し...
-
特定のスキーマのテーブルを一...
-
CLOB型へのINSERT
-
RDBのテーブル種類の違い
-
INDEXの無効化
-
oracleのimpdpでORA-39166
-
カラムの存在チェック
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テーブルからのselectにおいて...
-
postgreSQLのint型は桁数指定が...
-
UNIQUEをつけたときのINDEXテー...
-
SQL文作成のお願い
-
PostgressからMySQL(MariaDB)...
-
pl/pgsqlで変数の扱い
-
ビット演算結果の取得
-
講座のある日を抽出したい
-
こんばんは。
-
plpgsqlのエスケープ文字について
-
postgreSQLの正規表現
-
SQL SELECT文 別テーブルのレコ...
-
postgreSQLのオートナンバーに...
-
postgreSQL SQL
-
テーブル作成 外部参照 配列
-
Perl DBI でSELECT ilikeの結果...
-
phpPgAdminからSQL文を発行し、...
-
検索スピードの速い方法を教え...
-
チェックボックスから、データ...
-
クエリアナライザのsp_helpコマ...
おすすめ情報