不存在给出零行
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 行。
我已经阅读了很多与此相关的答案,所有人都说两者的工作原理几乎相同,除了空值的情况,而不适用于单个列。
任务是在 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 行。