То, каково различие между НЕ, СУЩЕСТВУЕТ по сравнению с НЕ В по сравнению с ЛЕВЫМ СОЕДИНЕНИЕМ, ГДЕ ЯВЛЯЕТСЯ ПУСТЫМ?

Мне кажется, что Вы можете сделать то же самое в 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

Я не уверен, получил ли я весь корректный синтаксис, но это общие методы, которые я видел. Почему я принял бы решение использовать один по другому? Производительность отличается...? Какой из них является самым быстрым / самый эффективный? (Если бы это зависит от реализации, когда я использовал бы каждого?)

140
задан froadie 11 February 2010 в 18:39
поделиться

3 ответа

В двух словах:

NOT IN немного отличается: он никогда не совпадает, если в списке есть только один NULL.

  • В MySQL, NOT EXISTS немного менее эффективен

  • В SQL Server, LEFT JOIN / IS NULL менее эффективен

  • В PostgreSQL, NOT IN менее эффективен

  • В Oracle, все три метода одинаковы.

128
ответ дан 23 November 2019 в 23:16
поделиться

Если база данных хорошо оптимизирует запрос, два первых будут преобразованы в нечто близкое к третьему.

Для простых ситуаций, таких как в вашем вопросе, разница должна быть незначительной или вообще отсутствовать, поскольку все они будут выполняться как соединения. В более сложных запросах база данных может оказаться не в состоянии сделать объединение из запросов not in и not exists. В этом случае запросы будут выполняться намного медленнее. С другой стороны, объединение может также плохо работать, если нет индекса, который можно использовать, поэтому если вы используете объединение, это не значит, что вы в безопасности. Чтобы определить, есть ли проблемы с производительностью, необходимо изучить план выполнения запроса.

5
ответ дан 23 November 2019 в 23:16
поделиться

Когда нужно вставить данные в таблицу с многополевым первичным ключом, учтите, что это будет намного быстрее (я пробовал в Access, но думаю, что в любой базе данных ) не проверять, что «в таблице нет записей с« такими »значениями», а просто вставить в таблицу, и лишние записи (по ключу) не будут вставлены дважды.

0
ответ дан 23 November 2019 в 23:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: