SQL

Рекурсивный CTE для иерархий

Algonexys · 07.08.2026 · 👁 0

Обход дерева категорий или комментариев любой глубины одним запросом.

Код

-- Все потомки категории вместе с уровнем вложенности и путём
WITH RECURSIVE tree AS (
    -- якорь: стартовая категория
    SELECT id, parent_id, name, 0 AS depth, name::text AS path
    FROM categories
    WHERE id = 1

    UNION ALL

    -- рекурсивная часть
    SELECT c.id, c.parent_id, c.name, t.depth + 1, t.path || ' / ' || c.name
    FROM categories c
    JOIN tree t ON c.parent_id = t.id
    WHERE t.depth < 10          -- защита от циклов
)
SELECT REPEAT('  ', depth) || name AS tree_view, path, depth
FROM tree
ORDER BY path;

-- Обратный обход: все предки узла
WITH RECURSIVE parents AS (
    SELECT id, parent_id, name FROM categories WHERE id = 42
    UNION ALL
    SELECT c.id, c.parent_id, c.name
    FROM categories c JOIN parents p ON c.id = p.parent_id
)
SELECT * FROM parents;