CTE

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

CTE даёт имя промежуточному результату

Common Table Expression создаётся через WITH. Он позволяет вынести отдельную выборку вверх запроса, дать ей понятное имя и затем обращаться к ней как к временной таблице в рамках этого SQL-выражения.

WITH paid_orders AS (
    SELECT id, user_id, amount
    FROM orders
    WHERE status = 'PAID'
)
SELECT user_id, SUM(amount) AS total
FROM paid_orders
GROUP BY user_id;

Сначала определяется набор paid_orders, затем основной запрос работает уже с ним. Логика не обязательно становится другой — но структура сложного запроса часто становится заметно понятнее.

CTE существует только в рамках одного выражения

CTE не создаёт постоянную таблицу в базе. Его имя доступно только запросу, который следует после блока WITH.

CTE — прежде всего инструмент структуры запроса. Не стоит автоматически считать его быстрее или медленнее аналогичного подзапроса: фактическое выполнение зависит от СУБД и плана запроса.