25

親子関係を表す表があります。関係はnレベル深くなる可能性があります。

次のクエリを使用してサンプルテーブルを作成しました。

CREATE SEQUENCE relations_rel_id_seq
    INCREMENT BY 1
    NO MAXVALUE
    NO MINVALUE
    CACHE 1;
CREATE TABLE relations(
    rel_id bigint DEFAULT nextval('relations_rel_id_seq'::regclass) NOT NULL PRIMARY KEY,
    rel_name text,
    rel_display text,
    rel_parent bigint
);

SQLFiddle

テーブルをクエリして、親子関係を階層的に表示する必要があります。SQLクエリを使用してnレベルのディープをクエリする方法についてはまだわかりません。

sqlfiddleの場合、たとえば、出力の予想される階層は次のとおりです。

rel1
    rel11
        rel111
        rel112
            rel1121
rel2
    rel21
        rel211
        rel212

注意:値n、inn-levelは不明です。

DBデザイン:

クエリを簡単にするために、そのような関係をデータベースで表現できるより良い方法はありますか?

4

1 に答える 1

52

Postgresを使用すると、再帰共通テーブル式を使用できます。

with recursive rel_tree as (
   select rel_id, rel_name, rel_parent, 1 as level, array[rel_id] as path_info
   from relations 
   where rel_parent is null
   union all
   select c.rel_id, rpad(' ', p.level * 2) || c.rel_name, c.rel_parent, p.level + 1, p.path_info||c.rel_id
   from relations c
     join rel_tree p on c.rel_parent = p.rel_id
)
select rel_id, rel_name
from rel_tree
order by path_info;

あなたの例に基づくSQLFiddle:http ://sqlfiddle.com/#!11/59319/19

(SQLFiddleはスペースを正しく表示しないため、インデント用のスペースをアンダースコアに置き換えました)

于 2013-02-02T16:53:03.047 に答える