Найти записи, которые присутствуют в одной таблице и отсутствуют во второй
Если ваша СУБД не умеет выполнять вложенные запросы (например, MySQL версий ниже 4.1), то вариант такой:
SELECT * FROM table1
LEFT JOIN table2 ON table1.id=table2.id
WHERE table2.id IS NULL;
Для СУБД, умеющих выполнять подзапросы, есть еще два варианта: с использованием конструкции NOT IN
и с использованием NOT EXISTS
.
SELECT * FROM table1
WHERE id NOT IN (
SELECT id FROM table2
WHERE id IS NOT NULL
);
Вариант с NOT IN
всегда быстрее варианта с NOT EXIST
в случаях, когда число записей в таблице table1 больше числа записей в таблице table2.
SELECT * FROM table1
WHERE NOT EXISTS (
SELECT id FROM table2
WHERE id=table1.id
);
Если известно, что table2 имеет больше записей, чем table2, то NOT IN
будет выполняться быстрее только на таблицах с небольшим числом записей (до сотен тысяч записей), а на больши́х объемах выигрывает NOT EXIST
. Причем, чем больше записей в таблице table2 тем существеннее разница в скорости выполнения. Но только при наличии индекса по полю id.