SQL recursive CTE: построить дерево из parent_id

Категория: Postgresql · Язык: SQL · Обновлено:

WITH RECURSIVE обходит иерархию, начиная с корневой строки и повторно присоединяя дочерние записи. Добавьте уровень глубины, чтобы сортировать дерево и ограничить неожиданный цикл. ??????? ????????? ?????? ?? ????????? ??????? ? ??????? ???? ?????????? ?? ????? ??????.

Рабочий пример

SQL
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.