Два запроса с одинаковыми таблицами и логикой объединения, но разными результатами - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь получить записи только в 1 таблице, то есть в A, но не в B case1:

 select count(distinct t.col1),count(distinct t.col2)
    from `table1` e
    right join
    (
    select distinct col1,col2
    from `table2_*`
    where _table_suffix between '20180101' and '20181231'
    )t
    on e.col1=t.col1
    where date(timestamp_seconds(ts))>='2018-01-01'
    and e.col1 is null
    ;

Case2:

select count(distinct col1)
from `table2_*`
where _table_suffix between '20180101' and '20181231'
and col1 not in (
select distinct col1 from `table1`
where date(timestamp_seconds(ts))>='2018-01-01'
)

Из 2 кодов case2 сработалв то время как case1 дал 0 в качестве вывода.Я также пробовал случай 1 как левое соединение с перевернутыми таблицами, но результаты были такими же, 0 строк.Я новичок в Big Query и стандартной версии SQL и не уверен, почему это произойдет.

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

При использовании NOT IN вы не должны разрешать NULL в качестве значения "в списке"

SELECT count(DISTINCT t.col1)
FROM `table2_ * ` AS t
WHERE t._table_suffix BETWEEN '20180101' AND '20181231'
 AND col1 NOT IN (
  SELECT DISTINCT e.col1
  FROM `table1` AS e
  WHERE DATE (timestamp_seconds(e.ts)) >= '2018-01-01'
   AND e.col1 IS NOT NULL
  );

Лично я предпочитаю использовать NOT EXISTS вместо:

SELECT count(DISTINCT t.col1)
FROM `table2_ * ` AS t
WHERE t._table_suffix BETWEEN '20180101' AND '20181231'
 AND NOT EXISTS (
  SELECT NULL
  FROM `table1` AS e
  WHERE DATE (timestamp_seconds(e.ts)) >= '2018-01-01'
   AND e.col1 = t.col1
  );

Обратите внимание, что в предложении выбора подзапроса здесь нет необходимости возвращать какие-либо значения, поэтому select null или select 1 или select * являются действительными.При использовании exits или not exists имеют значение предложения from и where подзапроса.

0 голосов
/ 11 декабря 2018

Из 2 кодов case2 работал, в то время как case1 выдавал 0 в качестве вывода.

Это потому, что NOT IN возвращает NULL, если в списке есть NULL.Если вам не нужно это поведение, исключите значения NULL:

select count(distinct col1)
from `table2_*`
where _table_suffix between '20180101' and '20181231'
and col1 not in (
select distinct col1 from `table1`
where date(timestamp_seconds(ts))>='2018-01-01'
and col1 IS NOT NULL
)
...