Рекурсивні CTE: дерева та ієрархії в SQL
Коротко: Рекурсивне CTE («common table expression») викликає саме себе в SQL і так обходить дерева та ієрархії, наприклад категорії, оргструктури чи відповіді в гілках форуму.
Докладніше: Звичайні запити знають фіксовану кількість з’єднань. В ієрархій глибина невідома. Рекурсивне CTE повторює крок, доки не перестане додаватися щось нове.
Подробиці
- Структура: Початкова частина (якір),
UNION ALLі рекурсивна частина, що посилається на саме CTE.
WITH RECURSIVE tree AS (
SELECT id, name, parent_id, 0 AS depth
FROM category WHERE parent_id IS NULL
UNION ALL
SELECT c.id, c.name, c.parent_id, t.depth + 1
FROM category c JOIN tree t ON c.parent_id = t.id
)
SELECT * FROM tree ORDER BY depth;- Перебіг: Якір дає корені, рекурсивна частина щоразу бере дітей рядків, знайдених останніми.
- Захист від нескінченних циклів: За циклів (A → B → A) треба запам’ятовувати відвідані вузли або обмежувати глибину.
- Інші застосування: Генерація числових рядів, пошук шляхів у графах, розгортання специфікацій.
- Альтернативи: Стовпець зі шляхом («materialized path»), вкладені множини (nested sets),
ltreeу PostgreSQL.
Див. також: віконні функції SQL