Почему этот пункт «не в» не делает то, что я ожидаю? - PullRequest
0 голосов
/ 15 апреля 2020

Я пишу, как мне кажется, простой запрос с использованием оператора «не в», и он не выполняет то, что я ожидаю.

Справочная информация:

  • У меня есть две таблицы, Contact и Company.
  • Contact включает столбцы ContactID (личность) и CompanyID (в какой компании они работают)
  • Ожидается, что значения CompanyID будут эквивалентны идентификаторам CompanyID в таблице Company
  • Я хочу написать запрос, который проверяет, сколько людей из таблицы контактов имеют «недопустимый» идентификатор компании (т. Е. Указан как работающий для компании, которой нет в таблице компании)

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

select
    count(ContactID)
from
    Contact left join Company on Contact.CompanyID = Company.CompanyID
where
    Company.CompanyID is null;

Этот запрос возвращает значение 2725538 , которое я считаю правильным ответом (я мы выполнили простую отладку «покажи мне первые 10 строк», и она, кажется, считает правильные строки).


Я написал второй запрос, который, как я ожидал, выдаст тот же результат:

select
    count(ContactID)
from
    Contact
where
    CompanyID not in
        (select
            CompanyID
        from
            Company)

Однако, это Вместо этого запрос s возвращает 0 .


Чтобы помочь мне отладить это, я проверил два дополнительных запроса.

Сначала я попытался закомментировать предложение WHERE, которое должен дать мне всех идентификаторов контактов, независимо от того, работают ли они в недействительной компании:

select
    count(ContactID)
from
    Contact

Этот запрос возвращает 29722995 .

Во-вторых, я попытался удалить NOT из моего запроса, что должно дать мне значение, обратное тому, что я ищу (т. Е. Он должен учитывать число контактов, работающих в действующих компаниях):

select
    count(ContactID)
from
    Contact
where
    CompanyID in
        (select
            CompanyID
        from
            Company)

Этот запрос возвращает 26997457 .


Примечательно, что эти два числа отличаются на ровно на 2725538 , число, возвращаемое первым рабочим запросом. Это то, что я ожидал бы, если бы мой второй запрос работал . Общее количество контактов, за вычетом количества контактов, чьи CompanyID равны в таблице Company, должно равняться числу контактов, чьи CompanyID не в таблице Company, не так ли? ?

Итак, почему версия запроса "not in" возвращает 0 вместо правильного ответа?

1 Ответ

2 голосов
/ 15 апреля 2020

единственная проблема может иметь NULL CompanyID. Not In не работает с NULL s из-за несопоставимости NULL.

попробуйте следующее:

select
    count(ContactID)
from
    Contact
where
    CompanyID not in
        (select
            ISNULL(CompanyID,'')
        from
            Company)

вы можете увидеть пример в db <> скрипка здесь .

Подробнее см. ЗДЕСЬ .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...