Что такое CTE?
Common Table Expressions (CTE) – это временные именованные результирующие наборы, определяемые с помощью предложения WITH, доступные для использования в рамках одного запроса.
WITH cte_name AS (
SELECT ...
)
SELECT * FROM cte_name;
Ключевые преимущества перед подзапросами
- Читаемость – CTE используют осмысленные имена для промежуточных результатов, что упрощает понимание сложных запросов
- Переиспользуемость – одно и то же CTE можно использовать несколько раз в рамках одного запроса, избегая дублирования логики подзапросов
- Рекурсия – CTE поддерживают рекурсивные запросы, необходимые для обхода иерархических данных, таких как организационные структуры или деревья категорий
- Поддерживаемость – разделение логики на именованные шаги упрощает отладку и обновление запросов по сравнению с глубоко вложенными подзапросами
Когда использовать CTE
- Промежуточный результат нужен более одного раза
- Запрос включает иерархические или рекурсивные структуры данных
- Ты хочешь улучшить читаемость, разделив сложную логику на понятные последовательные этапы
- Ты пишешь запросы, которые другим нужно будет ревьюить или поддерживать
Когда использовать подзапрос
- Логика простая и используется только один раз, что делает полноценное CTE излишне громоздким
- Нужен встроенный фильтр или вычисление, тесно связанные с конкретной частью запроса
- Профилирование производительности показывает, что подзапрос эффективнее в конкретной СУБД
Итоги
CTE и подзапросы часто взаимозаменяемы, но CTE в целом предпочтительнее для сложных, многоэтапных или рекурсивных запросов, где важны ясность и поддерживаемость. Подзапросы остаются практичным выбором для простой логики, используемой один раз, встроенной непосредственно в запрос.