SQL - объединенная строка в предложении where не работает должным образом - Redshift - PullRequest
0 голосов
/ 21 апреля 2020

Это SQL (красное смещение), на которое я ссылаюсь:

SELECT * 
  FROM table_a
 WHERE col_a||col_b NOT IN 
            (
                SELECT col_a||col_b 
                  from table_b
            );

В table_a есть значения, которых нет в table_b, но это всегда приводит к отсутствию строк.

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 23 апреля 2020

Подзапрос может иметь нулевое значение, что не соответствует условию not in.

Используйте coalesce для замены нуля на соответствующее значение, основанное на ваших данных. Я использовал символ ~ вместо нуля

SELECT * 
  FROM table_a
 WHERE col_a||col_b NOT IN 
            (
                SELECT coalesce (col_a,'~')||coalesce (col_b , '~')
                  from table_b
            );
0 голосов
/ 21 апреля 2020

Используйте NOT EXISTS, а не NOT IN !!! NOT IN не вернет вообще никаких строк, если любое значение в подзапросе равно NULL. Кроме того, вы сравниваете несколько столбцов, объединяя их. Это может быть плохим методом из-за коллизий: ab / c соответствует a / b c.

Так что используйте это:

SELECT a.* 
FROM table_a a
WHERE NOT EXISTS (SELECT 1
                  FROM table_b b
                  WHERE b.col_a = a.col_a AND b.col_b = a.col_b
                 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...