Вы пишете SELECT u.user_id, (SELECT order_id FROM orders o WHERE o.user_id = u.user_id) AS last_order_id FROM users u. Что может пойти не так и как исправить, чтобы подзапрос стал скалярным?
AЕсли у пользователя несколько заказов, подзапрос вернёт несколько строк и запрос упадёт; нужно гарантировать одно значение (например,
MAX, MIN или LIMIT 1).BЗапрос всегда вернёт случайный
order_id, потому что подзапрос выполняется один раз.CНужно заменить подзапрос на
IN, иначе SELECT не сможет выполниться.DНужно добавить
DISTINCT во внешний SELECT, и тогда подзапрос станет скалярным.Правильный ответ. Скалярный подзапрос в
SELECT должен возвращать ровно одну строку и одну колонку для каждой строки внешнего запроса.Разбор
Если подзапрос потенциально возвращает несколько строк (например, у пользователя несколько заказов), СУБД обычно выдаст ошибку «more than one row returned». Чтобы сделать подзапрос скалярным, нужно явно свести результат к одному значению: агрегатом (MAX/MIN) или ограничением (LIMIT 1 вместе с явным правилом выбора).
Проверь себя · 1/3разбор после ответа
Нужно посчитать средний дневной доход: сначала
SUM(amount) по каждому дню, затем AVG по дням. Какой запрос соответствует этой логике?Ещё вопросы по теме «Подзапросы и CTE»
- В отчёте нужно посчитать выручку по странам пользователей только по оплаченным заказам за период. Какой подход обычно делает запрос более читаемым и позволяет переиспользовать шаг фильтрации?
- Вы выбираете пользователей, у которых есть хотя бы один платеж. В таблице `payments` поле `user_id` иногда бывает `NULL` (например, анонимные платежи). Почему в такой ситуации часто предпочитают `EXISTS`, а не `IN`?
- Нужно выбрать заказы, у которых `amount` выше среднего `amount` по тому же пользователю. Какой вариант `WHERE` корректно использует коррелированный подзапрос?
- Вы готовите дашборд: нужно (1) топ товаров по выручке за период и (2) общая выручка за тот же период. Какой вариант снижает риск, что фильтр по периоду рассинхронизируется между расчётами?
- Вы ищете пользователей без заказов. Почему запрос `SELECT u.user_id FROM users u WHERE u.user_id NOT IN (SELECT o.user_id FROM orders o)` может вернуть 0 строк и какой подход безопаснее?
- Все вопросы по «Подзапросы и CTE» →