В чем разница между рекурсивным и нерекурсивным CTE

«В чем разница между рекурсивным и нерекурсивным CTE» — вопрос из категории Базы данных, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Рекурсивное 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 полезны для иерархических данных (деревья, графы).