红移意外返回一个子查询没有找到项的空值

问题描述 投票:1回答:1

我有这样的查询返回真实没有结果:

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)

为什么红移在此查询的第二个记录返回“NULL”值?而且,更具体地讲,我怎么能得到我的第一次查询返回130811274(和其它评论)是在review_table但不是在review_migration_table

sql null amazon-redshift notin
1个回答
1
投票

你可以认为a NOT IN(b, c)的等同于NOT (a=b OR a=c)。我认为这是在review_migration_table表的review_id列NULL值,所以这样你NOT (a=b OR a=NULL)这要么如果FALSE或NULL,如果a=ba<>b。这里最简单的解决办法可能是从review_id列表,e.g过滤掉NULL IN

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 
© www.soinside.com 2019 - 2024. All rights reserved.