Возможно, у вас есть NULL-ы в ViewA.material
. Другой способ решить вашу проблему:
select * from TableA where TableA.Material not in (select ViewA.material from ViewA where ViewA.material IS NOT NULL)
Предположим, что ViewA.material
имеет значения 1, 2 и NULL. Запрос с IN
будет эквивалентен:
select * from TableA where Material=1 OR Material=2 OR Material=NULL
Даже если TableA будет содержать строку с NULL, условие Material=NULL
не будет истинным, поскольку NULL = NULL неизвестно (по крайней мере, при настройке по умолчанию и рекомендуемой настройке SET ANSI_NULLS ON
). Однако TRUE OR unknown
создает TRUE
, поэтому этот запрос дает правильные результаты.
Запрос с NOT IN
будет эквивалентен:
select * from TableA where Material<>1 AND Material<>2 AND Material<>NULL
В этом случае TRUE AND unknown
выдает unknown
, поэтому этот запрос никогда не вернет никаких результатов.