Мне кажется, что Вы можете сделать то же самое в SQL-запросе с помощью или НЕ СУЩЕСТВУЕТЕ, НЕ В, или ОСТАВЛЕННОЕ СОЕДИНЕНИЕ, ГДЕ ЯВЛЯЕТСЯ ПУСТЫМ. Например:
SELECT a FROM table1 WHERE a NOT IN (SELECT a FROM table2)
SELECT a FROM table1 WHERE NOT EXISTS (SELECT * FROM table2 WHERE table1.a = table2.a)
SELECT a FROM table1 LEFT JOIN table2 ON table1.a = table2.a WHERE table1.a IS NULL
Я не уверен, получил ли я весь корректный синтаксис, но это общие методы, которые я видел. Почему я принял бы решение использовать один по другому? Производительность отличается...? Какой из них является самым быстрым / самый эффективный? (Если бы это зависит от реализации, когда я использовал бы каждого?)
В двух словах:
NOT IN
немного отличается: он никогда не совпадает, если в списке есть только один NULL
.
В MySQL
, NOT EXISTS
немного менее эффективен
В SQL Server
, LEFT JOIN / IS NULL
менее эффективен
В PostgreSQL
, NOT IN
менее эффективен
В Oracle
, все три метода одинаковы.
Если база данных хорошо оптимизирует запрос, два первых будут преобразованы в нечто близкое к третьему.
Для простых ситуаций, таких как в вашем вопросе, разница должна быть незначительной или вообще отсутствовать, поскольку все они будут выполняться как соединения. В более сложных запросах база данных может оказаться не в состоянии сделать объединение из запросов not in
и not exists
. В этом случае запросы будут выполняться намного медленнее. С другой стороны, объединение может также плохо работать, если нет индекса, который можно использовать, поэтому если вы используете объединение, это не значит, что вы в безопасности. Чтобы определить, есть ли проблемы с производительностью, необходимо изучить план выполнения запроса.
Когда нужно вставить данные в таблицу с многополевым первичным ключом, учтите, что это будет намного быстрее (я пробовал в Access, но думаю, что в любой базе данных ) не проверять, что «в таблице нет записей с« такими »значениями», а просто вставить в таблицу, и лишние записи (по ключу) не будут вставлены дважды.