Нужно вывести список пользователей, которые сделали покупку в 2025 году, без дубликатов. Какой вариант делает это корректно без DISTINCT?

ASELECT u.user_id FROM users u WHERE EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.user_id AND o.created_at >= '2025-01-01' AND o.created_at < '2026-01-01')
BSELECT u.user_id FROM users u JOIN orders o ON o.user_id = u.user_id WHERE o.created_at >= '2025-01-01' AND o.created_at < '2026-01-01'
CSELECT o.user_id FROM orders o WHERE o.created_at >= '2025-01-01' AND o.created_at < '2026-01-01'
DSELECT u.user_id FROM users u WHERE (SELECT o.order_id FROM orders o WHERE o.user_id = u.user_id AND o.created_at >= '2025-01-01' AND o.created_at < '2026-01-01') IS NOT NULL
Правильный ответ. EXISTS — удобный способ проверить наличие связанных строк, сохраняя по одной строке внешней таблицы.

Разбор

Если вы берёте строки из orders, пользователь с несколькими заказами появится несколько раз. JOIN с orders ведёт к тому же эффекту, если не добавлять DISTINCT или агрегацию. EXISTS проверяет наличие хотя бы одной строки orders для текущего пользователя и поэтому не размножает строки users.

Проверь себя · 1/3разбор после ответа
Нужно выбрать заказы, у которых amount выше среднего amount по тому же пользователю. Какой вариант WHERE корректно использует коррелированный подзапрос?
Тренировать SQL в Telegram

Ещё вопросы по теме «Подзапросы и CTE»