SELECT * WHERE NOT EXISTS

时间:2009-05-27 13:17:25

标签: mysql

我想我正走这条路的正确道路......请耐心等待我,因为我的SQL不是最好的

我正在尝试查询数据库以从一个表中选择某些单元格中不存在某些单元格的所有内容。这很多没有多大意义,但我希望这段代码能

SELECT * from employees WHERE NOT EXISTS (SELECT name FROM eotm_dyn)

所以基本上我有一张桌子,里面有员工及其详细信息。然后另一个表格包含其他一些细节,包括他们的名字。如果名称不在eotm_dyn表中,意味着没有条目,我想确切地知道他们是谁,或者换句话说,看看究竟缺少什么。

上面的查询没有返回任何内容,但我知道有20个名字丢失,所以我显然没有做对。

有人可以帮忙吗?

5 个答案:

答案 0 :(得分:142)

您没有在查询中加入该表格。

除非eotm_dyn中根本没有记录,否则您的原始查询将始终不返回任何内容,在这种情况下,它将返回所有内容。

假设这些表格应在employeeID上加入,请使用以下内容:

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

您可以使用LEFT JOIN关键字加入这些表并过滤掉NULL,但这可能不如使用NOT EXISTS效率高。

答案 1 :(得分:77)

SELECT * FROM employees WHERE name NOT IN (SELECT name FROM eotm_dyn)

OR

SELECT * FROM employees WHERE NOT EXISTS (SELECT * FROM eotm_dyn WHERE eotm_dyn.name = employees.name)

OR

SELECT * FROM employees LEFT OUTER JOIN eotm_dyn ON eotm_dyn.name = employees.name WHERE eotm_dyn IS NULL

答案 2 :(得分:11)

您可以执行LEFT JOIN并断言连接列为NULL。

示例:

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

答案 3 :(得分:7)

SELECT * from employees
WHERE NOT EXISTS (SELECT name FROM eotm_dyn)

除非eotm_dyn为空,否则永远不会返回任何记录。您需要SELECT name FROM eotm_dyn上的某种条件

SELECT * from employees
WHERE NOT EXISTS (
    SELECT name FROM eotm_dyn WHERE eotm_dyn.employeeid = employees.employeeid
)

假设两个表由外键关系链接。此时,您可以使用各种其他选项,包括LEFT JOIN。但是,在大多数情况下,优化器通常会处理它们。

答案 4 :(得分:4)

您还可以查看this related question。该用户报告说,使用连接提供了比使用子查询更好的性能。