Вы разбираете сложный отчёт коллеги: 4 уровня вложенных подзапросов в FROM без имён шагов. Решаете переписать через WITH. Какое практическое преимущество даёт CTE по сравнению с вложенными подзапросами?
ACTE автоматически делает результаты точнее за счёт пересчёта промежуточных шагов с большей точностью
BCTE запрещает использовать
NULL в промежуточных шагах, поэтому скрытых ошибок становится меньшеCCTE гарантирует ускорение запроса за счёт материализации и кэширования каждого шага планировщиком
DCTE даёт шагам имена, позволяет переиспользовать их и проверять промежуточные результаты отдельно
Правильный ответ.
WITH улучшает читаемость: вы именуете шаги и можете запускать их по отдельности для проверки.Разбор
CTE превращает сложную логику в последовательность небольших шагов: фильтрация, обогащение, агрегация. Это снижает когнитивную нагрузку и помогает обнаруживать ошибки раньше, например неправильную гранулярность или лишние строки. Кроме того, если один и тот же шаг нужен дважды, его можно переиспользовать без копирования условий. Утверждения про точность, запрет NULL или гарантированное ускорение — мифы, которые часто повторяют новички.
Проверь себя · 1/3разбор после ответа
Вы разбираете сложный отчёт коллеги: 4 уровня вложенных подзапросов в
FROM без имён шагов. Решаете переписать через WITH. Какое практическое преимущество даёт CTE по сравнению с вложенными подзапросами?Ещё вопросы по теме «Подзапросы и CTE»
- В отчёте нужно посчитать выручку по странам пользователей только по оплаченным заказам за период, причём шаг «оплаченные за период» используется ещё в трёх соседних метриках. Какой подход обычно делает запрос проверяемее и позволяет переиспользовать фильтрацию?
- Вы выбираете пользователей, у которых есть хотя бы один платёж. В таблице `payments` поле `user_id` иногда бывает `NULL` (например, анонимные платежи). Почему в такой ситуации часто предпочитают `EXISTS`, а не `IN`?
- Вы пишете `SELECT u.user_id, (SELECT order_id FROM orders o WHERE o.user_id = u.user_id) AS last_order_id FROM users u`. Что может пойти не так и как исправить, чтобы подзапрос стал скалярным?
- Нужно выбрать заказы, у которых `amount` выше среднего `amount` по тому же пользователю. Какой вариант `WHERE` корректно использует коррелированный подзапрос?
- Дашборд содержит две метрики на одних и тех же продажах: топ товаров по выручке за период и общая выручка за тот же период. Витрина обновляется ежедневно, и важно, чтобы фильтр по периоду был один и тот же для обеих цифр. Какой подход надёжнее защищает от рассинхронизации?
- Все вопросы по «Подзапросы и CTE» →