Таблица eligible_users(user_id) может содержать повторяющиеся user_id. Таблица blocked_users(user_id) — список блокировок. Нужно получить уникальный список пользователей из eligible_users, которых нет в blocked_users, без добавления DISTINCT. Что выбрать?

ASELECT e.user_id FROM eligible_users e LEFT JOIN blocked_users b ON e.user_id = b.user_id WHERE b.user_id IS NULL;
BSELECT e.user_id FROM eligible_users e INNER JOIN blocked_users b ON e.user_id = b.user_id;
CSELECT user_id FROM eligible_users UNION ALL SELECT user_id FROM blocked_users;
DSELECT user_id FROM eligible_users EXCEPT SELECT user_id FROM blocked_users;
Правильный ответ. EXCEPT работает как операция над множествами и по умолчанию возвращает уникальные значения, поэтому помогает убрать дубликаты без DISTINCT.

Разбор

Анти-джойн через LEFT JOIN ... WHERE b.user_id IS NULL вернёт столько строк, сколько было в eligible_users, включая повторяющиеся user_id. Если нужен именно уникальный список и вы не хотите добавлять DISTINCT, то EXCEPT решает сразу две задачи: убирает пользователей из blocked_users и возвращает результат как множество (без повторов).

Проверь себя · 1/3разбор после ответа
Какое утверждение про RIGHT JOIN верно в аналитических запросах?
Тренировать SQL в Telegram

Ещё вопросы по теме «JOIN и операции множеств»