首页 > 解决方案 > Redshift 意外返回子查询中未找到的项目的空值

问题描述

我有这个查询没有返回任何结果:

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”值?而且,更具体地说,我怎样才能让我的第一个查询返回 130811274 (和其他评论)在review_table不在 review_migration_table

标签: sqlnullamazon-redshiftnotin

解决方案


你可以认为a NOT IN(b, c)相当于NOT (a=b OR a=c)。我认为review_idreview_migration_table 表的列中有一个 NULL 值,因此你有NOT (a=b OR a=NULL)哪个会给出FALSEifa=b或 NULL if a<>b。这里最简单的解决方法可能是review_idIN列表中过滤掉 NULL,例如:

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 

推荐阅读