Redshift 意外返回子查询中未找到的项目的空值
Posted
技术标签:
【中文标题】Redshift 意外返回子查询中未找到的项目的空值【英文标题】:Redshift unexpectedly returns a null value for items not found in a sub-query 【发布时间】:2019-02-04 18:28:34 【问题描述】:我的这个查询没有返回任何结果:
SELECT review_id
FROM review_table
WHERE review_id NOT IN (
SELECT DISTINCT review_id
FROM review_migration_table
)
ORDER BY review_id
但是,我希望它返回所有不在我的迁移表中的review_id
s(我正在尝试识别所有未成功迁移的评论)。我期待非空结果的原因是我知道review_table
中的评论不在review_migration_table
中:
SELECT
review_id,
review_id NOT IN (
SELECT DISTINCT review_id
FROM review_migration_table
WHERE filter_column = 170938)
FROM review_table
WHERE
filter_column = 170938
ORDER BY review_id ASC
review_id | ?column?
-----------+----------
127260864 | f
130811274 |
(2 rows)
为什么 Redshift 在此查询中为第二条记录返回“NULL”值?而且,更具体地说,如何让我的第一个查询返回 review_table
但不在 review_migration_table
中的 130811274(和其他评论)?
【问题讨论】:
【参考方案1】:你可以认为a NOT IN(b, c)
等同于NOT (a=b OR a=c)
。我认为 review_migration_table 表的review_id
列中有一个 NULL 值,因此您有NOT (a=b OR a=NULL)
,如果a=b
将给出FALSE
,如果a<>b
给出NULL。这里最简单的解决方法可能是从IN
列表中过滤掉NULL review_id
,例如:
SELECT
review_id,
review_id NOT IN (
SELECT DISTINCT review_id
FROM review_migration_table
WHERE filter_column = 170938 and review_id IS NOT NULL)
FROM review_table
WHERE
filter_column = 170938
ORDER BY review_id ASC
【讨论】:
是的 - 出乎意料的NULL
值就是它。谢谢! (现在开始确定为什么那里有一个NULL
值...... =D)以上是关于Redshift 意外返回子查询中未找到的项目的空值的主要内容,如果未能解决你的问题,请参考以下文章
在 Redshift 查询中为 max(date) 函数指定意外事件