Что такое CTE (Common Table Expressions) в SQL и в чем их польза?

Ответ

CTE (Common Table Expressions) — это именованный временный набор результатов, который существует только в рамках выполнения одного SQL-запроса (SELECT, INSERT, UPDATE или DELETE). CTE определяется с помощью ключевого слова WITH.

Основная цель CTE — улучшить читаемость и структуру сложных запросов, разбивая их на логические блоки.

Ключевые преимущества:

  • Читаемость: Длинные и сложные подзапросы можно вынести в отдельные именованные блоки.
  • Многократное использование: На один и тот же CTE можно ссылаться несколько раз в основном запросе.
  • Рекурсия: CTE позволяют выполнять рекурсивные запросы, что идеально подходит для работы с иерархическими данными (например, деревья категорий, организационные структуры).

Пример простого (нерекурсивного) CTE:

Предположим, нам нужно найти заказы пользователей, которые зарегистрировались в 2023 году.

WITH active_users AS (
    -- Шаг 1: Выбираем ID пользователей, зарегистрированных в 2023
    SELECT id
    FROM users
    WHERE EXTRACT(YEAR FROM registration_date) = 2023
)
-- Шаг 2: Используем результат для фильтрации заказов
SELECT *
FROM orders
WHERE user_id IN (SELECT id FROM active_users);

Пример рекурсивного CTE:

Рекурсивные CTE используются для обхода древовидных или графовых структур. Например, для получения всех дочерних узлов для заданного родителя.

-- Найти всех сотрудников в подчинении у менеджера с id = 1
WITH RECURSIVE subordinates AS (
    -- Начальная часть (anchor member): сам менеджер
    SELECT id, name, manager_id
    FROM employees
    WHERE id = 1

    UNION ALL

    -- Рекурсивная часть (recursive member): присоединяем прямых подчиненных
    SELECT e.id, e.name, e.manager_id
    FROM employees e
    INNER JOIN subordinates s ON s.id = e.manager_id
)
SELECT * FROM subordinates;