В фильтре вы пишете WHERE o.product_id = (SELECT product_id FROM featured_products), а в таблице featured_products несколько строк. Что верно?
AПодзапрос вернёт несколько строк, сравнение через
= станет ошибкой; нужно использовать IN или сделать подзапрос скалярным через MAX / MINBСравнение через
= автоматически возьмёт первый product_id из подзапроса по порядку строк, поэтому фильтр всё равно отработает без ошибокCНужно заменить
= на LIKE: оператор LIKE умеет работать с несколькими строками подзапроса и без явного IN подберёт совпаденияDДостаточно добавить
DISTINCT в подзапрос: после DISTINCT он гарантированно вернёт ровно одну строку и сравнение через = станет корректнымПравильный ответ. Оператор
= ожидает одно значение справа; если подзапрос возвращает набор, используйте IN или агрегируйте до одного значения.Разбор
Подзапрос в правой части = обязан вернуть ровно одно значение. Если он возвращает несколько строк, большинство СУБД выдаёт ошибку. Если вы хотите проверить принадлежность множеству значений, используйте IN. Если по смыслу нужно именно одно значение, сделайте подзапрос скалярным — например, агрегатом MAX или MIN или явным ограничением результата.
Проверь себя · 1/3разбор после ответа
В одном отчёте вы считаете несколько метрик по событиям:
dau, wau и число покупок. У всех метрик один и тот же фильтр: только продакшн-трафик и только выбранный период. Какой подход лучше защищает от ситуации, когда в одной метрике забыли часть фильтра?Ещё вопросы по теме «Подзапросы и 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» →