不存在给出零行

Not Exists giving zero rows

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

任务是在 invoice_line_items table:

中找到从未分配给任何行项目的每个帐号

正确查询是:

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 中的选择过程有何不同。

您应该在整个查询中使用限定的列引用来编写它。此外,子查询中的 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 子查询 returns NULL for any 行。