Redshift неожиданно возвращает нулевое значение для элементов, не найденных в подзапросе - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть этот запрос, который не дает результатов:

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 возвращает aЗначение NULL для 2-й записи в этом запросе?И, более конкретно, как я могу получить свой первый запрос, чтобы вернуть 130811274 (и другие отзывы), которые находятся в review_table, но не в review_migration_table?

1 Ответ

0 голосов
/ 05 февраля 2019

Вы можете думать, что a NOT IN(b, c) эквивалентно NOT (a=b OR a=c).Я думаю, что в столбце review_id таблицы review_migration_table есть значение NULL, поэтому у вас есть NOT (a=b OR a=NULL), который либо выдаст FALSE, если a=b, либо NULL, если a<>b.Возможно, самый простой обходной путь - это отфильтровать NULL review_id из списка 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 
...