gpt4 book ai didi

sql - 加入 "exists"子查询

转载 作者:行者123 更新时间:2023-12-05 00:22:37 25 4
gpt4 key购买 nike

我想知道为什么当你在一个存在子查询中的一个键上连接两个表时,连接必须发生在 WHERE 子句而不是 FROM 子句中。

这是我的例子:

在 FROM 子句中加入:

SELECT payer_id
FROM Population1
WHERE NOT EXISTS
(Select *
From Population2 join Population1
On Population2.payer_id = Population1.payer_id)

在 WHERE 子句中加入:
SELECT payer_id
FROM Population1
WHERE NOT EXISTS
(Select *
From Population2
WHERE Population2.payer_id = Population1.payer_id)

第一个查询给出了 0 个结果,我知道这是不正确的,而第二个查询给出了我期望看到的数千个结果。

有人可以向我解释为什么在 EXISTS 子查询中连接发生的位置很重要吗?如果您使用没有父查询的子查询并运行它们,它们实际上会给您相同的结果。

记住在使用exists时不要继续犯这个错误对我有很大帮助。

提前致谢。

最佳答案

您需要了解常规子查询和相关子查询之间的区别。

使用您的示例,这应该很容易。第一个 where 子句是:

where not exists (Select 1
from Population2 join
Population1
on Population2.payer_id = Population1.payer_id
)

这个条件完全按照它所说的去做。子查询与外部查询没有联系。因此, not exists 将过滤掉所有行或保留所有行。

在这种情况下,引擎运行子查询并确定至少返回一行。因此, not exists 在所有情况下都返回 false,并且没有返回任何内容。

在第二种情况下,子查询是相关子查询。因此,对于 population1 中的每一行,子查询都使用 Population1.payer_id 的值运行。在某些情况下, Population2 中存在匹配的行;这些都被过滤掉了。在其他情况下,匹配行不存在;这些在结果集中。

关于sql - 加入 "exists"子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41472065/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com