我应该使用not exists或join语句来过滤掉NULL吗?

时间:2010-02-22 04:54:59

标签: sql database join null exists

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 个答案:

答案 0 :(得分:4)

假设涉及的列值不能为NULL -

MySQL的:

LEFT JOIN/IS NULL 效率NOT EXISTS更高效 - 阅读this article for details

甲骨文:

They are equivalent

SQL Server:

NOT EXISTSLEFT JOIN/IS NULL - read this article for details 更高效

Postgres的:

与Oracle一样,they are equivalent

如果您对列值不能为null的详细信息有疑问,但使用LEFT JOIN / IS NULL - 请记住LEFT JOIN表示的内容。 This link可能有帮助。

答案 1 :(得分:2)

我真的认为你应该描述这样一个问题。它不仅依赖于确切的数据库产品,而且理论上它还可能取决于数据的偏差。

然而!默认情况下,我会说编写最明确表达您意图的代码。您在employee条记录之后没有匹配的eotm_dyn,因此IMO 最清晰的代码为WHERE NOT EXISTS。它可能无关紧要,但我会使用SELECT 1(而不是SELECT name),因为name在“没有匹配的eotm_dyn逻辑时并不重要。” p>

一旦你有代表表达你想要和工作的代码,那么看看基于分析优化