Redshift 意外 returns 子查询中未找到的项目的空值
Redshift unexpectedly returns a null value for items not found in a sub-query
我的查询 return 没有结果:
SELECT review_id
FROM review_table
WHERE review_id NOT IN (
SELECT DISTINCT review_id
FROM review_migration_table
)
ORDER BY review_id
但是,我希望它 return 所有 review_id
不在我的迁移中 table(我正在尝试识别所有未成功迁移的评论).我期待非空结果的原因是我 知道 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 return 是此查询中第二条记录的 "NULL" 值?而且,更具体地说,我怎样才能得到我对 return 130811274(和其他评论)的第一个查询,这些查询在 review_table
但 不在 review_migration_table
中?
你可以认为a NOT IN(b, c)
等同于NOT (a=b OR a=c)
。我认为 review_migration_table table 的 review_id
列中有一个 NULL 值,因此你有 NOT (a=b OR a=NULL)
如果 [=16],它将给出 FALSE
=] 或 NULL 如果 a<>b
。这里最简单的解决方法可能是从 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
我的查询 return 没有结果:
SELECT review_id
FROM review_table
WHERE review_id NOT IN (
SELECT DISTINCT review_id
FROM review_migration_table
)
ORDER BY review_id
但是,我希望它 return 所有 review_id
不在我的迁移中 table(我正在尝试识别所有未成功迁移的评论).我期待非空结果的原因是我 知道 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 return 是此查询中第二条记录的 "NULL" 值?而且,更具体地说,我怎样才能得到我对 return 130811274(和其他评论)的第一个查询,这些查询在 review_table
但 不在 review_migration_table
中?
你可以认为a NOT IN(b, c)
等同于NOT (a=b OR a=c)
。我认为 review_migration_table table 的 review_id
列中有一个 NULL 值,因此你有 NOT (a=b OR a=NULL)
如果 [=16],它将给出 FALSE
=] 或 NULL 如果 a<>b
。这里最简单的解决方法可能是从 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