5

PostgreSQLデータベースに次のテーブルがあります(parent_fkは同じテーブルを参照する外部キーです)。

id    |    parent_fk
72    |    
342   |    72
583   |    342

このテーブルをクエリして、中間の親子関係を介して最終的な親への各要素のパスを見つけたいと思います。たとえば、SQLクエリへの回答として次の情報を取得したいと思います。

id    |    parent_fk    |    path
72    |                 |     72
342   |    72           |    72;342
583   |    342          |   72;342;583

CTE(Common Table Expressions)とPostgreSQLの再帰クエリについて読みましたが、この問題を自分で解決することはまだできませんでした。何か案は?前もって感謝します。

4

1 に答える 1

11

この種のことの多くを行っている場合は、 ltreecontribモジュールを調べることをお勧めします。

これがその仕事をするCTEです。SQLFiddleを参照してください:

WITH RECURSIVE x(id,parent_fk,parents,last_id, depth) AS (
  SELECT id, parent_fk, ARRAY[id] AS parents, id AS last_id, 0 AS depth FROM table1
  UNION ALL
  SELECT x.id, x.parent_fk, parents||t1.parent_fk, t1.parent_fk AS last_id, x.depth + 1
  FROM x 
    INNER JOIN table1 t1 
    ON (last_id= t1.id)
  WHERE t1.parent_fk IS NOT NULL
)
SELECT id, parent_fk, array_to_string(parents,';')
FROM x 
WHERE depth = (SELECT max(sq.depth) FROM x sq WHERE sq.id = x.id);

テーブルは、エッジのセットとしての有向グラフの表現です。グラフがツリーであると指定しました。これは、グラフが非循環であることを意味します。ツリー上の各ノード(内部またはリーフ)からルートまでのパスを見つけて、それをセミコロンで区切られた文字列として表す必要があります。

于 2012-10-25T01:42:05.180 に答える