SELECT foreignStockId
FROM   [Subset].[dbo].[Products]  
可能会传回NULL。
一NOT IN如有查询将不会返回任何行NULL中的列表中存在小号NOT IN值。您可以使用IS NOT NULL以下方法明确排除它们。
SELECT stock.IdStock,
       stock.Descr
FROM   [Inventory].[dbo].[Stock] stock
WHERE  stock.IdStock NOT IN (SELECT foreignStockId
                             FROM   [Subset].[dbo].[Products]
                             WHERE  foreignStockId IS NOT NULL) 
或改用NOT EXISTS代替。
SELECT stock.idstock,
       stock.descr
FROM   [Inventory].[dbo].[Stock] stock
WHERE  NOT EXISTS (SELECT *
                   FROM   [Subset].[dbo].[Products] p
                   WHERE  p.foreignstockid = stock.idstock) 
拥有您想要执行计划的语义NOT EXISTS通常会更简单,如此处所示。
行为差异的原因归结于SQL中使用的  三值逻辑。谓词可以计算为True,False或Unknown。
一个WHERE子句必须评估到True为了要返回的行,但这个是不可能的NOT IN,当NULL如下面解释目前是。
'A' NOT IN ('X','Y',NULL) 相当于 'A' <> 'X' AND 'A' <> 'Y' AND 'A' <> NULL)
- 'A'<>'X'= 
True 
- 'A'<>'Y'= 
True 
- 'A'<> NULL = 
Unknown 
True AND True AND UnknownUnknown根据真值表评估三个有价值的逻辑。
以下链接对各种选项的性能进行了其他讨论。