Anti-join возвращает строки из одной таблицы, которые не имеют совпадающих строк во второй таблице на основе заданного условия. Проще говоря, он отвечает на вопрос: «Какие записи есть в A, но нет в B?»
Есть три широко используемых SQL-подхода для реализации anti-join:
1. LEFT JOIN с проверкой NULL
SELECT a.*
FROM table_a a
LEFT JOIN table_b b ON a.id = b.id
WHERE b.id IS NULL;
Объединяет обе таблицы и оставляет только строки, для которых не нашлось совпадения в table_b.
2. NOT EXISTS
SELECT a.*
FROM table_a a
WHERE NOT EXISTS (
SELECT 1 FROM table_b b WHERE b.id = a.id
);
Часто предпочитается за читаемость и может быть эффективнее, когда table_b большая.
3. NOT IN
SELECT a.*
FROM table_a a
WHERE a.id NOT IN (SELECT id FROM table_b);
Будь осторожен — если table_b содержит значения NULL, NOT IN может неожиданно вернуть пустой результат.
NULL в столбце подзапросаLEFT JOIN + IS NULL и NOT EXISTS с примерно одинаковой производительностьюAnti-join возвращает все строки из левой таблицы независимо от того, есть ли совпадения в правой таблице, а затем фильтрует результаты по условию WHERE.
Новый — ещё не проверен сообществом
Вы