INTERSECT и EXCEPT — два оператора, которые иногда могут решить задачу проще, чем JOIN
Оба оператора сравнивают результаты двух SELECT и работают с наборами строк, часто еще говорят с множествами.
INTERSECT оставляет только то, что есть в обоих результатах.
Например, есть пользователи двух сервисов:
В результате останутся только user_id, которые встретились и в service_a, и в service_b.
EXCEPT работает наоборот: оставляет строки из первого SELECT, которых нет во втором.
Так мы получим пользователей service_a, которых нет в service_b.
Главное отличие:
→ INTERSECT = пересечение двух наборов
→ EXCEPT = первый набор минус второй
Для EXCEPT порядок запросов имеет значение:
A EXCEPT B — это не то же самое, что B EXCEPT A.
По умолчанию оба оператора удаляют дубликаты. Если повторяющиеся строки нужно учитывать, в PostgreSQL есть INTERSECT ALL и EXCEPT ALL.
Практический вывод: если задача звучит как «найти строки, которые есть в обоих результатах» — смотрим в сторону INTERSECT.
Если как «найти строки из первого результата, которых нет во втором» — EXCEPT.
Оба оператора сравнивают результаты двух SELECT и работают с наборами строк, часто еще говорят с множествами.
INTERSECT оставляет только то, что есть в обоих результатах.
Например, есть пользователи двух сервисов:
SELECT user_id FROM service_a
INTERSECT
SELECT user_id FROM service_b;
В результате останутся только user_id, которые встретились и в service_a, и в service_b.
EXCEPT работает наоборот: оставляет строки из первого SELECT, которых нет во втором.
SELECT user_id FROM service_a
EXCEPT
SELECT user_id FROM service_b;
Так мы получим пользователей service_a, которых нет в service_b.
Главное отличие:
→ INTERSECT = пересечение двух наборов
→ EXCEPT = первый набор минус второй
Для EXCEPT порядок запросов имеет значение:
A EXCEPT B — это не то же самое, что B EXCEPT A.
По умолчанию оба оператора удаляют дубликаты. Если повторяющиеся строки нужно учитывать, в PostgreSQL есть INTERSECT ALL и EXCEPT ALL.
Практический вывод: если задача звучит как «найти строки, которые есть в обоих результатах» — смотрим в сторону INTERSECT.
Если как «найти строки из первого результата, которых нет во втором» — EXCEPT.
🔥1