1
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

哪个更有效,一些分析?

4

2 回答 2

4

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

MySQL:

LEFT JOIN/IS NULL比阅读这篇文章有效NOT EXISTS

甲骨文:

它们是等价的

SQL 服务器:

NOT EXISTS阅读这篇文章更有效LEFT JOIN/IS NULL

Postgres:

与 Oracle 一样,它们是等价的

如果您对列值不能为空的细节有疑问,请使用 LEFT JOIN / IS NULL - 请记住 LEFT JOIN 的含义。 此链接可能会有所帮助。

于 2010-02-22T05:16:27.383 回答
2

我真的认为您应该针对这样的问题进行简介。它不仅取决于确切的数据库产品,而且理论上它还可能取决于数据的偏差。

然而!默认情况下,我会说编写最清楚地表达您的意图的代码。您正在employee寻找没有匹配的记录eotm_dyn,因此 IMO最清晰的代码是WHERE NOT EXISTS. 这可能无关紧要,但我会使用SELECT 1(not SELECT name),因为在“没有匹配逻辑name的情况下”并不重要。eotm_dyn

一旦你的代码表达了你的意图和工作,然后看看基于 profiling的优化。

于 2010-02-22T05:13:08.077 回答