Я пишу, как мне кажется, простой запрос с использованием оператора «не в», и он не выполняет то, что я ожидаю.
Справочная информация:
- У меня есть две таблицы, 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 вместо правильного ответа?