Как использовать рекурсивный запрос в качестве подзапроса 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 шт):
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