Нужно вывести по каждому заказу признак has_refund: есть ли хотя бы одна запись в refunds по этому заказу. Таблица refunds может иметь несколько строк на один заказ. Какой вариант корректен и не размножает заказы?
A
SELECT o.order_id, r.refund_id IS NOT NULL AS has_refund FROM orders o LEFT JOIN refunds r ON r.order_id = o.order_idB
SELECT o.order_id, (SELECT r.refund_id FROM refunds r WHERE r.order_id = o.order_id) AS has_refund FROM orders oC
SELECT o.order_id, CASE WHEN EXISTS (SELECT 1 FROM refunds r WHERE r.order_id = o.order_id) THEN 1 ELSE 0 END AS has_refund FROM orders oD
SELECT o.order_id FROM orders o WHERE o.order_id IN (SELECT r.order_id FROM refunds r) AND 1 AS has_refundПравильный ответ.
EXISTS внутри CASE даёт один логический ответ на строку orders и не создаёт дубликаты строк.Разбор
LEFT JOIN к таблице refunds может размножить строки заказов, если по заказу несколько возвратов. Скалярный подзапрос, который возвращает refund_id, тоже рискован: при нескольких строках он упадёт. Конструкция CASE WHEN EXISTS (...) THEN 1 ELSE 0 END явно выражает проверку наличия связанных строк и всегда возвращает одно значение на заказ.
Проверь себя · 1/3разбор после ответа
Нужно посчитать средний дневной доход: сначала
SUM(amount) по каждому дню, затем AVG по дням. Какой запрос соответствует этой логике?Ещё вопросы по теме «Подзапросы и 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» →