Как использовать рекурсивный запрос в качестве подзапроса postgresql

Есть таблица с постами, в ней содержится id поста, и id родительского поста. В случае, когда родительского поста нет в поле парент null

CREATE TABLE post(
   id SERIAL NOT NULL,
   parent integer
)

Вот мой рекурсивный запрос, который достает пост и всех его потомков.

WITH RECURSIVE
     under_parent(id, lvl) AS (
         VALUES (5, 0)
         UNION ALL
         SELECT forum.post.id,  under_parent.lvl + 1
         FROM forum.post JOIN  under_parent ON forum.post.parent =  under_parent.id
     )

SELECT lvl, id FROM  under_parent ORDER BY lvl, id;

В данном запросе достаются все посты, которые являются потомками поста с id 5.

Моя проблема состоит в том, что мне нужно достать всех потомков всех постов с parent null. У меня есть предположение, что подобный перебор можно сделать с помощью подзапроса, но я совершенно не могу представить, как это сделать.

Т.е я хочу , если в таблице 2 поста с нулевым парентом, сначала вывелся первый пост с нулевым паррентом и все его потомки, а затем второй


Ответы (1 шт):

Автор решения: Akina
WITH RECURSIVE
tree (id, root, path, lvl) AS (
    SELECT id, id, id::TEXT, 1
    FROM post
    WHERE parent IS NULL
UNION ALL
    SELECT post.id, tree.root, tree.path || '-' || post.id::TEXt, tree.lvl + 1
    FROM post
    JOIN tree ON tree.id = post.parent
) 
SELECT *
FROM tree
ORDER BY root, path

https://dbfiddle.uk/?rdbms=postgres_12&fiddle=d8a3a64d3146376a96037eca02e45923

→ Ссылка