不存在,给出零行

问题描述 投票:0回答:1

我看了很多与此相关的答案,都说除了在空值的情况下,两者的工作原理几乎一样,而不是在单列工作。

我们的任务是找到发票_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中,选择过程有什么不同。

mysql sql rdbms not-exists notin
1个回答
0
投票

你应该在整个查询中使用限定列引用来写。 此外, 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 对于 任何 行。

© www.soinside.com 2019 - 2024. All rights reserved.