【问题标题】:Not Exists giving zero rows不存在给出零行
【发布时间】:2020-08-16 14:46:41
【问题描述】:

我已经阅读了许多与此相关的答案,并且所有人都说两者的工作原理几乎相同,除了在空值的情况下,而不是在单个列的情况下。

任务是在 invoice_line_items 表中查找从未分配给任何行项目的每个帐号:

正确的查询是:

SELECT 
    account_number, account_description
FROM
    general_ledger_accounts gl
WHERE
    NOT EXISTS( SELECT 
            account_number
        FROM
            invoice_line_items
        WHERE
            gl.account_number = account_number);

如果我删除 gl.account_number = account_number 它返回零行。

我想知道: 1 ) 为什么在子查询中需要声明 gl.account_number = account_number。
2 ) Not In 和 Not Exists 中的选择过程有何不同。

【问题讨论】:

  • 我没有完全理解你的问题。您的代码与not exists 完全不同。
  • @GordonLinoff 我想知道为什么要在子查询中使用 gl.account_number = account_number?

标签: mysql sql rdbms not-exists notin


【解决方案1】:

您应该在整个查询中使用合格的列引用来编写它。此外,子查询中的select 无关紧要,所以我通常使用1

SELECT gl.account_number, gl.account_description
FROM general_ledger_accounts gl
WHERE NOT EXISTS (SELECT 1
                  FROM invoice_line_items ili
                  WHERE gl.account_number = ili.account_number
                 );

子查询是一个相关子查询,因为where 子句将ili 上的内部子查询连接到gl 上的外部子查询。从概念上讲,这是通过gl 中的每个帐户进行的。当没有行与特定的 account_number 匹配时,where 子句的计算结果为 true

这类似于NOT IN,除了 -- 正如您自己指出的 -- 当 NOT IN 子查询为 any 行返回 NULL 时。

【讨论】:

  • 如果我删除子查询中的 where 子句会怎样
  • @BrijeshJoshi 。 . .这将不是一个相关的子查询。外部查询将返回所有行(如果ili 中有任何行)或如果没有行则根本不返回行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-20
  • 2019-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-10
相关资源
最近更新 更多