111

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

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

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

所以基本上我有一张桌子,上面有员工名单及其详细信息。然后是另一个包含一些其他详细信息的表,包括他们的名字。如果 eotm_dyn 表中没有名称,这意味着它们没有条目,我想看看他们到底是谁,或者换句话说,看看到底缺少什么。

上面的查询什么也没返回,但我知道有 20 个名字不见了,所以我显然没有做对。

任何人都可以帮忙吗?

4

5 回答 5

176

您没有在查询中加入表。

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

假设这些表应该在 上连接employeeID,请使用以下命令:

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

您可以使用关键字连接这些表LEFT JOIN并过滤掉NULL's,但这可能不如使用NOT EXISTS.

于 2009-05-27T13:19:17.007 回答
87
SELECT * FROM employees WHERE name NOT IN (SELECT name FROM eotm_dyn)

或者

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

或者

SELECT * FROM employees LEFT OUTER JOIN eotm_dyn ON eotm_dyn.name = employees.name WHERE eotm_dyn IS NULL
于 2009-05-27T13:20:41.870 回答
13

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

例子:

SELECT * FROM employees a LEFT JOIN eotm_dyn b on (a.joinfield=b.joinfield) WHERE b.name IS NULL
于 2009-05-27T13:19:59.313 回答
8
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。然而,在大多数情况下,优化器通常会以相同的方式处理它们。

于 2009-05-27T13:24:26.280 回答
4

你也可以看看这个相关的问题。该用户报告说,使用联接提供了比使用子查询更好的性能。

于 2009-05-27T13:26:17.633 回答