我有这样的查询返回真实没有结果:
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)
为什么红移在此查询的第二个记录返回“NULL”值?而且,更具体地讲,我怎么能得到我的第一次查询返回130811274(和其它评论)是在review_table
但不是在review_migration_table
?
你可以认为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=b
给a<>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