SQL подсчитывает не суммируется при использовании предложений «NOT IN» и «IN» - PullRequest
0 голосов
/ 26 марта 2020

У меня есть две таблицы, T1 и T2, которые имеют несколько общих записей. Я пытаюсь выяснить, какие записи распределяются между ними. Просто чтобы уточнить, «msg» уникально для каждой записи.

T1 имеет ~ 1,4 миллиона записей. Когда я запускаю

select count(*) from T1 where msg in (select msg from T2)

, я получаю ~ 950 000 записей. Хорошо, 950 тыс. Из 1,4 млн. Там должно быть около 450 тыс. Записей, которые появляются, когда я запускаю обратное право? Запрос ниже:

select count(*) from T1 where msg not in (select msg from T2)

Этот запрос фактически возвращает 0. Как это возможно? Кроме того, когда я запускаю

select count(*) from T1 where id not in (select id from T2)

, я получаю около 1100 записей, так что, очевидно, есть некоторые записи в T1, которых нет в T2.

Чего мне не хватает? Любая помощь очень ценится.

Ответы [ 2 ]

1 голос
/ 26 марта 2020

Всегда go для предложения NOT EXISTS вместо NOT IN.

Причина в том, что даже если в подзапросе присутствует одно значение NULL, SQL Сервер возвращает 0 строк, потому что NOT IN не будет совпадать ни с одной строкой.

select count(*) from T1 where msg not in (select msg from T2)

эквивалентно

select count(*) from T1 
WHERE (
msg != (SELECT msg FROM t2 WHERE ID=1)
AND
msg!= (SELECT msg FROM t2 WHERE ID=2)
.
.
.
msg!= (SELECT msg FROM t2 WHERE ID=SomeBigNumber)
)

Подробнее о NOT IN против NOT EXISTS

Итак, измените ваш запрос с

SELECT * FROM T1
WHERE msg NOT IN (select msg from T2);

на

SELECT * FROM T1
WHERE NOT EXISTS (select 1 from T2 WHERE T2.msg=T1.msg);

Я создал SQL Fiddle . Пожалуйста, обратитесь так же.

1 голос
/ 26 марта 2020

Вы сталкиваетесь с значениями NULL внутри предложения NOT IN проблема.

Вы должны сделать что-то вроде этого

SET ANSI_NULLS ON;

SET ANSI_NULLS

Указывает ISO-совместимое поведение операторов сравнения Equals (=) и Not Equal To (<>), когда они используются со значениями NULL в SQL Server 2019 (15.x).

Прочитайте следующую ветку, чтобы лучше понять.

NULL-значения внутри предложения NOT IN

...