我有两个数据库,一个数据库保存库存,另一个数据库包含主数据库记录的子集。
以下SQL语句不起作用:
SELECT stock.IdStock ,stock.Descr FROM [Inventory].[dbo].[Stock] stock WHERE stock.IdStock NOT IN (SELECT foreignStockId FROM [Subset].[dbo].[Products])
不在中不起作用。删除NOT会给出正确的结果,即两个数据库中都有产品。但是,使用NOT IN根本不会返回任何结果。
我在做什么错,有什么想法吗?
SELECT foreignStockId FROM [Subset].[dbo].[Products]
可能会传回NULL。
NULL
一NOT IN如有查询将不会返回任何行NULL中的列表中存在小号NOT IN值。您可以使用IS NOT 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代替。
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。
True
False
Unknown
一个WHERE子句必须评估到True为了要返回的行,但这个是不可能的NOT IN,当NULL如下面解释目前是。
WHERE
'A' NOT IN ('X','Y',NULL) 相当于 'A' <> 'X' AND 'A' <> 'Y' AND 'A' <> NULL)
'A' NOT IN ('X','Y',NULL)
'A' <> 'X' AND 'A' <> 'Y' AND 'A' <> NULL)
True AND True ANDUnknown``Unknown根据真值表评估三个有价值的逻辑。
True AND True ANDUnknown``Unknown