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も見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
テーブルからのselectにおいて...
-
postgreSQLのint型は桁数指定が...
-
PostgressからMySQL(MariaDB)...
-
pl/pgsqlで変数の扱い
-
SQL文作成のお願い
-
postgreSQLの正規表現
-
全テーブルのデータの行数
-
SQL SELECT文 別テーブルのレコ...
-
チェックボックスから、データ...
-
データを削除しても表領域の使...
-
異なるスキーマからデータを抽...
-
特定のスキーマのテーブルを一...
-
Viewにインデックスは張れ...
-
DELETE文でFROM句を省略した場合
-
Access レコードを追加できませ...
-
CLOB型へのINSERT
-
ACCESS 複数テーブル・複数フィ...
-
csvをSQLiteに取り込むと文字化...
-
count(1)とcount(*)の違い
-
select insert 句
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
postgreSQLのint型は桁数指定が...
-
テーブルからのselectにおいて...
-
PostgressからMySQL(MariaDB)...
-
UNIQUEをつけたときのINDEXテー...
-
クエリアナライザのsp_helpコマ...
-
SQL SELECT文 別テーブルのレコ...
-
SQL文作成のお願い
-
3つのテーブルの処理について
-
全テーブルのデータの行数
-
SQLで検索結果の記事を表示したい
-
近い時間によるテーブル結合
-
PostgresSQL8.4でツリー上に取...
-
SELECT結果から重複行を除く方法
-
Perl DBI でSELECT ilikeの結果...
-
2つの異なるテーブルを和結合し...
-
賢いSQL文がわからない
-
チェックボックスから、データ...
-
Viewにインデックスは張れ...
-
データを削除しても表領域の使...
-
異なるスキーマからデータを抽...
おすすめ情報