Recursive CTE

Базовый SQL
≈ 1 мин чтения

Рекурсивный CTE использует собственный результат

Обычный CTE вычисляется один раз как именованный набор. Рекурсивный CTE может ссылаться на себя и шаг за шагом добавлять новые строки, пока очередной шаг больше ничего не возвращает.

Две части рекурсии

У рекурсивного CTE есть начальная часть, которая создаёт первые строки, и рекурсивная часть, которая строит следующие строки на основе уже полученных.

WITH RECURSIVE numbers(n) AS (
    SELECT 1
    UNION ALL
    SELECT n + 1
    FROM numbers
    WHERE n < 5
)
SELECT n
FROM numbers;

Начальная часть создаёт число 1. Затем рекурсивная часть берёт текущее значение и добавляет следующее, пока условие n < 5 позволяет продолжать. Результат — числа от 1 до 5.

Где это применяется

Главный практический сценарий — иерархические данные: дерево категорий, структура подразделений, комментарии с родительскими сообщениями и другие модели «родитель → потомок».

У рекурсии должно быть условие остановки. Ошибочная рекурсивная часть может генерировать строки слишком долго или бесконечно с точки зрения логики запроса. Поэтому всегда проверяй, что каждый шаг действительно приближает вычисление к завершению.