Ответ
Рекурсивное CTE (Common Table Expression) вызывает само себя, создавая итеративный процесс, а нерекурсивное — просто определяет временный набор данных.
Пример рекурсивного CTE (вычисление факториала):
WITH RECURSIVE factorial(n, fact) AS (
SELECT 1, 1 -- начальное условие
UNION ALL
SELECT n + 1, (n + 1) * fact FROM factorial WHERE n < 5 -- рекурсивная часть
)
SELECT * FROM factorial;
Нерекурсивное CTE (простой запрос):
WITH users AS (
SELECT id, name FROM customers WHERE active = true
)
SELECT * FROM users;
Ключевые отличия:
- Рекурсивное CTE требует
RECURSIVE(в PostgreSQL) и имеет базовый случай + рекурсивную часть. - Нерекурсивное — просто временное представление для упрощения запроса.
- Рекурсивные CTE полезны для иерархических данных (деревья, графы).