WHERE NOT IN возвращает пустой набор, а не должен - PullRequest
0 голосов
/ 17 июня 2020

Этот запрос возвращает мне 90 826 строк:

SELECT DISTINCT ClientID FROM devices;

Теперь я проверяю, сколько из них присутствует в другой таблице с тем же столбцом:

SELECT DISTINCT ClientID FROM devices
WHERE ClientID IN
(
    SELECT DISTINCT ClientID FROM patients
);

Это дает назад 90 736 строк, поэтому 90 строк не должно быть в этой другой таблице. Давайте проверим это, чтобы убедиться:

SELECT DISTINCT ClientID FROM devices
WHERE ClientID NOT IN
(
    SELECT DISTINCT ClientID FROM patients
);

Но это возвращает мне пустой набор, 0 строк. Это не должно быть правильно, поэтому я go дальше, пробуя это:

SELECT DISTINCT ClientID FROM v_keszulekek
WHERE ClientID NOT IN
(
    SELECT DISTINCT ClientID FROM devices
    WHERE ClientID IN
    (
        SELECT DISTINCT ClientID FROM patients
    )
);

Это действительно возвращает мне 90 строк, но первая версия должна была работать, по моему мнению .

Ясно, что что-то не хватает.

1 Ответ

2 голосов
/ 18 июня 2020

NULL не является типом данных, и вы не можете использовать какой-либо фильтр или предложение IN, NOT IN et c. Вы должны явно исключить его, используя условие IS NULL OR IS NOT NULL . Здесь вы должны выполнить следующее, чтобы получить желаемый результат.

SELECT DISTINCT ClientID FROM devices WHERE ClientID IS NOT NULL AND ClientID NOT IN ( SELECT DISTINCT ClientID FROM patients WHERE ClientID IS NOT NULL );
...