SELECT*WHERE NOT EXISTS

Cia*_*ran 89 mysql

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

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

SELECT * from employees WHERE NOT EXISTS (SELECT name FROM eotm_dyn)
Run Code Online (Sandbox Code Playgroud)

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

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

有人可以帮忙吗?

Qua*_*noi 150

您没有在查询中加入表格.

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

假设应该连接这些表employeeID,请使用以下内容:

SELECT  *
FROM    employees e
WHERE   NOT EXISTS
        (
        SELECT  null 
        FROM    eotm_dyn d
        WHERE   d.employeeID = e.id
        )
Run Code Online (Sandbox Code Playgroud)

您可以使用LEFT JOIN关键字将这些表连接起来并过滤掉NULL,但这可能不如使用效率低NOT EXISTS.

  • 我需要每年两次"不存在",我总是忘记如何使用它.谢谢 - 这个例子现在会被加入书签. (28认同)
  • 有人可以参考“LEFT JOIN + NULL 过滤器的效率低于 NOT EXISTS”吗?这可能很明显,但我从未在文档中看到过。谢谢。 (2认同)
  • @ toni07实际上,这是一个传奇。左联接获胜。https://explainextended.com/2009/09/18/not-in-vs-not-exists-vs-left-join-is-null-mysql/ .. Quassnoi的博客始终是有用的资源。 (2认同)

Rob*_*Day 78

SELECT * FROM employees WHERE name NOT IN (SELECT name FROM eotm_dyn)
Run Code Online (Sandbox Code Playgroud)

要么

SELECT * FROM employees WHERE NOT EXISTS (SELECT * FROM eotm_dyn WHERE eotm_dyn.name = employees.name)
Run Code Online (Sandbox Code Playgroud)

要么

SELECT * FROM employees LEFT OUTER JOIN eotm_dyn ON eotm_dyn.name = employees.name WHERE eotm_dyn IS NULL
Run Code Online (Sandbox Code Playgroud)


Mik*_*ffe 12

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

例:

SELECT * FROM employees a LEFT JOIN eotm_dyn b on (a.joinfield=b.joinfield) WHERE b.name IS NULL
Run Code Online (Sandbox Code Playgroud)


Cad*_*oux 7

SELECT * from employees
WHERE NOT EXISTS (SELECT name FROM eotm_dyn)
Run Code Online (Sandbox Code Playgroud)

除非eotm_dyn是空的,否则不要返回任何记录 你需要某种对标准SELECT name FROM eotm_dyn

SELECT * from employees
WHERE NOT EXISTS (
    SELECT name FROM eotm_dyn WHERE eotm_dyn.employeeid = employees.employeeid
)
Run Code Online (Sandbox Code Playgroud)

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