3

以下はすべてのタプルを返し、階層内の各親を最上位まで解決することを期待していましたが、最下位レベル(IDがクエリで指定されている)のみを返します。特定のlevel_idのツリー全体を返すにはどうすればよいですか?

create table level(
level_id int,
level_name text,
parent_level int);

 insert into level values (197,'child',177), (  177, 'parent', 3 ), (  2, 'grandparent',  null  );

WITH RECURSIVE recursetree(level_id, levelparent) AS (
 SELECT level_id, parent_level 
 FROM level 
 where level_id = 197

UNION ALL
SELECT t.level_id, t.parent_level
FROM level t, recursetree rt 
WHERE rt.level_id = t.parent_level
)

SELECT * FROM recursetree;
4

1 に答える 1

8

まず第一に、それが本当に祖父母であるならば、あなた(2, 'grandparent', null)はそうあるべきです。(3, 'grandparent', null)次に、クエリの再帰的な半分の(暗黙の)結合条件が逆方向であるため、次の条件ではrt.levelparentなく、親を削除する必要がありt.parent_levelます。

WITH RECURSIVE recursetree(level_id, levelparent) AS (
    SELECT level_id, parent_level 
    FROM level 
    WHERE level_id = 197

    UNION ALL

    SELECT t.level_id, t.parent_level
    FROM level t JOIN recursetree rt ON rt.levelparent = t.level_id
    -- join condition fixed and ANSI-ified above
)
SELECT * FROM recursetree;
于 2013-01-24T00:16:56.663 に答える