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