我看了很多与此相关的答案,都说除了在空值的情况下,两者的工作原理几乎一样,而不是在单列工作。
我们的任务是找到发票_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中,选择过程有什么不同。
你应该在整个查询中使用限定列引用来写。 此外, 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
. 该 where
子句评价为 true
当没有符合特定的行 account_number
.
这类似于 NOT IN
除非--正如你自己所指出的--当... ... NOT IN
子查询返回 NULL
对于 任何 行。