【发布时间】:2016-10-24 20:09:44
【问题描述】:
我正在与一位合作伙伴一起从我们的数据仓库中提取一些数据,但由于某种原因,当我们的查询似乎在逻辑上相同时,我们得到了不同的结果。
我附上了我们执行的查询的简化和匿名版本。他们都执行查询,使用以下方法过滤结果:
不在
SELECT COUNT(DISTINCT organization_id)
FROM clients.organization
WHERE organization_id NOT IN (
SELECT owner_organization_id
FROM clients_enhanced.organization_team
);
左外连接 ... NULL
SELECT COUNT(DISTINCT o.organization_id)
FROM clients.organization AS o
LEFT OUTER JOIN (
SELECT DISTINCT owner_organization_id AS organization_id
FROM clients_enhanced.organization_team
) AS sub
ON o.organization_id = sub.organization_id
WHERE sub.organization_id IS NULL
;
除了
SELECT COUNT(distinct sub.organization_id)
FROM (
SELECT o.organization_id AS organization_id
FROM clients.organization AS o
EXCEPT
SELECT DISTINCT owner_organization_id
FROM clients_enhanced.organization_team
) AS sub
;
这些查询产生以下结果:
不在
count
-------
0
(1 row)
左外连接 ... NULL
count
--------
372421
(1 row)
除了
count
--------
372421
(1 row)
上面的查询在逻辑上不等效吗?还是我完全错过了什么?
作为参考,这些查询是在 Amazon Redshift 上执行的
【问题讨论】:
-
owner_organization_id可以为空吗?如果是,则需要在NOT IN解决方案的子选择中排除NULL值 -
是的,它可以是
NULL。是的,在NOT IN子查询中排除NULL确实会返回正确的结果。我假设这是因为 DBMS 检查子查询中的每个值是否是<>到您要检查的任何内容,并且在与NULL值比较时得到false?无论如何,如果您将此评论作为答案发布,我会将其标记为解决方案。 -
说明为什么您认为它们与引用权威文档的理由相同,或者您只是要求通过定制教程提供另一种语言定义,而没有告诉我们您当前的误解是什么。另外:这是一个常见问题。 .请在考虑发布之前阅读您的教科书和/或手册和谷歌任何错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有和没有您的特定字符串/名称和站点:stackoverflow.com 和标签;阅读许多答案。另外:对于代码问题,请给minimal reproducible example。
标签: sql amazon-redshift outer-join except notin