Должен ли я использовать не существует или оператор объединения, чтобы отфильтровать NULL? - PullRequest
1 голос
/ 22 февраля 2010
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 ]

4 голосов
/ 22 февраля 2010

Если предположить, что значения столбца не могут быть 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. Эта ссылка может помочь.

2 голосов
/ 22 февраля 2010

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

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

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

...