Shuold Я использую не существует или присоединяюсь к инструкции, чтобы отфильтровать NULL?

SELECT *
FROM employees e
WHERE NOT EXISTS
 (
 SELECT name 
 FROM eotm_dyn d
 WHERE d.employeeID = e.id
 )

И

SELECT * FROM employees a LEFT JOIN eotm_dyn b on (a.joinfield=b.joinfield) WHERE b.name IS NULL

Что более эффективно, некоторый анализ?

2 ответа

Предполагая, что значения столбца не могут быть NULL -

MySQL

LEFT JOIN/IS NULL более эффективный чем NOT EXISTS - прочитайте эту статью для более подробной информации.

Oracle:

Они эквивалентны.

SQL Server:

NOT EXISTS более эффективный, чем LEFT JOIN/IS NULL - подробнее прочитайте эту статью.

Postgres:

Как и Oracle, они эквивалентны.

Если у вас возникли проблемы с деталями, значения столбцов не могут быть нулевыми, но используйте LEFT JOIN/IS NULL - помните, что означает LEFT JOIN. Эта ссылка может помочь.


Я действительно думаю, что вы должны прокомментировать такой вопрос. Это зависит не только от точного продукта базы данных, но в теории это также может зависеть от искажения ваших данных.

Однако! По умолчанию я бы сказал, напишите код, который наиболее четко выражает ваши намерения. Вы находитесь за employee записями без соответствия eotm_dyn, поэтому IMO самый чистый код WHERE NOT EXISTS. Это, вероятно, не имеет значения, но я бы использовал SELECT 1 (not SELECT name), так как name не имеет значения в "без соответствующей логики eotm_dyn.

После того, как у вас есть код, который выражает то, что вы намереваетесь и работаете, посмотрите на оптимизацию на основе профилирования.

licensed under cc by-sa 3.0 with attribution.