Я столкнулся со странной ситуацией при попытке считать количество строк, которые НЕ имеют значений varchar указанными избранным оператором. Хорошо, это звучит сбивающим с толку даже меня, таким образом позвольте мне дать Вам пример:
Скажем, у меня есть поле "MyField" в "SomeTable", и я хочу включить, сколько строк значения MyField не принадлежат домену, определенному значениями "MyOtherField" в "SomeOtherTable". Другими словами, предположите, что у меня есть MyOtherField = {1, 2, 3}, я хочу включить, сколько строк значение MyField не 1, 2 или 3. Для этого я использовал бы следующий запрос:
SELECT COUNT(*) FROM SomeTable
WHERE ([MyField] NOT IN (SELECT MyOtherField FROM SomeOtherTable))
И это работает как очарование. Заметьте однако, что MyField и MyOtherField являются введенным интервалом. Если я пытаюсь выполнить тот же самый запрос, за исключением введенных полей varchar, его значение возврата 0 даже при том, что я знаю, что существуют неправильные значения, я поместил их там! И если я, однако, пытаюсь считать противоположное (сколько строк НАХОДИТСЯ в домене, настроенном против того, что я хочу, именно так много строк не), просто путем подавления "НЕ" пункта в запросе выше... Ну, ЭТО работает! ¬¬
Да, должны быть тонны обходных решений к этому, но я хотел бы знать, почему это не работает способ, которым это должно. Кроме того, я не могу просто изменить целый запрос, поскольку большая часть из него создается в коде C#, и в основном единственная первая часть имеет свободу измениться, который не окажет влияние ни в какой другой части программного обеспечения, избранный оператор, который соответствует домену (независимо от того, что входит НЕ В пункте). Я надеюсь, что ясно выразился, и кто-то там мог выручить меня.
Заранее спасибо.
Для NOT IN всегда ложно, если подзапрос возвращает значение NULL. Принятый ответ на этот вопрос элегантно описывает почему.
Возможность NULL для значения столбца также не зависит от используемого типа данных: скорее всего, ваши столбцы varchar имеют значения NULL
Постарайтесь с этим справиться, используйте NOT EXISTS. Для ненулевых значений он работает так же, как NOT IN, поэтому совместим
SELECT COUNT(*) FROM SomeTable S1
WHERE NOT EXISTS (SELECT * FROm SomeOtherTable S2 WHERE S1.[MyField] = S2.MyOtherField)
gbn предлагает более полный ответ, но я не хочу вспоминать все это. Вместо этого у меня есть религиозная привычка фильтровать нули из моих предложений IN:
SELECT COUNT(*)
FROM SomeTable
WHERE [MyField] NOT IN (
SELECT MyOtherField FROM SomeOtherTable
WHERE MyOtherField is not null
)