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_ids(我正在尝试识别所有未成功迁移的评论)。我期待非空结果的原因是我知道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 意外返回子查询中未找到的项目的空值的主要内容,如果未能解决你的问题,请参考以下文章

查看 - 如果在按查询分组的查询中未找到任何行,则返回 0

在 Redshift 查询中为 max(date) 函数指定意外事件

使用 case when 时出现 SQL (Redshift) 错误 - 不支持这种类型的相关子查询模式

PHP PDO ODBC 意外的空结果集

SQL子查询返回奇怪的结果

为啥 Redshift 不支持 DOES EXIST 相关子查询?