SQL recursive CTE: построить дерево из parent_id
WITH RECURSIVE обходит иерархию, начиная с корневой строки и повторно присоединяя дочерние записи. Добавьте уровень глубины, чтобы сортировать дерево и ограничить неожиданный цикл. ??????? ????????? ?????? ?? ????????? ??????? ? ??????? ???? ?????????? ?? ????? ??????.
Рабочий пример
WITH RECURSIVE tree(id, parent_id, depth) AS (
VALUES (1, NULL::int, 0)
UNION ALL
SELECT item.id, item.parent_id, tree.depth + 1
FROM categories AS item
JOIN tree ON item.parent_id = tree.id
WHERE tree.depth < 20
)
SELECT id, parent_id, depth FROM tree ORDER BY depth, id;Anchor query задаёт начальные строки, recursive term строит следующий уровень. PostgreSQL вычисляет уровни до пустого результата; depth cap защищает от бесконечного обхода цикличных данных.
Частый вопрос
Как получить путь до каждой вершины?
Добавьте массив пути в колонки CTE, дописывайте id при рекурсии и выводите его в финальном SELECT.