Вы ищете пользователей без заказов. Почему запрос SELECT u.user_id FROM users u WHERE u.user_id NOT IN (SELECT o.user_id FROM orders o) может вернуть 0 строк и какой подход безопаснее?
A
NOT IN всегда корректен, проблема только в том, что он медленнее NOT EXISTS.BНужно добавить
ORDER BY в подзапрос, иначе NOT IN не работает.CЕсли подзапрос возвращает хотя бы один
NULL, то условие NOT IN может стать UNKNOWN для всех строк; безопаснее использовать NOT EXISTS с корреляцией o.user_id = u.user_id.DНужно заменить
NOT IN на !=, чтобы исключить NULL.Правильный ответ.
NOT EXISTS проверяет отсутствие связанных строк, а NOT IN чувствителен к NULL в списке значений.Разбор
В трёхзначной логике SQL выражение x NOT IN (...) может стать UNKNOWN, если в списке есть NULL, даже когда явного совпадения нет. В WHERE это означает, что строка не пройдёт фильтр, и итог может оказаться пустым. NOT EXISTS формулирует задачу иначе: «нет ни одной строки, удовлетворяющей связи и условию», и поэтому гораздо надёжнее для анти-джойна.
Проверь себя · 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» →