选择不存在的地方

我认为我正在沿着这条正确的道路... 请容忍我,因为我的 SQL 不是最好的

我尝试查询一个数据库,从一个表中选择另一个表中不存在特定单元格的所有内容。这没什么意义,但我希望这段代码可以

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

所以基本上我有一张表,上面有员工的名单和他们的详细信息。然后是另一张桌子,上面有一些其他的细节,包括他们的名字。如果 eotm _ dyn 表中没有 name,这意味着没有它们的条目,那么我希望看到它们到底是谁,或者换句话说,看到到底缺少了什么。

上面的查询没有返回任何结果,但是我知道有20多个名字丢失了,所以我显然没有得到正确的结果。

Can anyone help?

330999 次浏览

您没有在查询中联接表。

除非 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效率低。

您可以执行左连接并断言连接的列为 NULL。

例如:

SELECT * FROM employees a LEFT JOIN eotm_dyn b on (a.joinfield=b.joinfield) WHERE b.name IS NULL
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)

或者

SELECT * FROM employees LEFT OUTER JOIN eotm_dyn ON eotm_dyn.name = employees.name WHERE eotm_dyn IS NULL
SELECT * from employees
WHERE NOT EXISTS (SELECT name FROM eotm_dyn)

除非 eotm_dyn为空,否则永远不要返回任何记录

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

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

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