【问题标题】:Inconsistent query results when using 'EXCEPT' vs 'NOT IN' vs 'OUTER JOIN ... WHERE NULL'使用“EXCEPT”与“NOT IN”与“OUTER JOIN ... WHERE NULL”时的查询结果不一致
【发布时间】: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


【解决方案1】:

可能是因为 Column 没有以表别名为前缀,所以会混淆。

SELECT COUNT(DISTINCT organization_id)
FROM clients.organization
WHERE organization_id NOT IN (
  SELECT c. owner_organization_id 
  FROM clients_enhanced.organization_team as c
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-04
    • 2019-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    相关资源
    最近更新 更多