SQL NOT IN不工作我有两个数据库,一个保存库存,另一个包含主数据库记录的子集。以下SQL语句不起作用:SELECT stock.IdStock ,stock.Descr
FROM [Inventory].[dbo].[Stock] stockWHERE stock.IdStock NOT IN
(SELECT foreignStockId FROM
[Subset].[dbo].[Products])不是不起作用。删除NOT会得到正确的结果,即两个数据库中的产品。但是,使用NOT IN并不会返回任何结果。我做错了什么,有什么想法吗?
3 回答
斯蒂芬大帝
TA贡献1827条经验 获得超8个赞
SELECT foreignStockIdFROM [Subset].[dbo].[Products]
可能会返回一个NULL
。
一NOT IN
如有查询将不会返回任何行NULL
中的列表中存在小号NOT IN
值。您可以使用IS NOT NULL
以下方式明确排除它们。
SELECT stock.IdStock, stock.DescrFROM [Inventory].[dbo].[Stock] stockWHERE stock.IdStock NOT IN (SELECT foreignStockId FROM [Subset].[dbo].[Products] WHERE foreignStockId IS NOT NULL)
或者NOT EXISTS
改为使用。
SELECT stock.idstock, stock.descrFROM [Inventory].[dbo].[Stock] stockWHERE 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 Unknown
Unknown
根据真值表评估三值逻辑。
以下链接对各种选项的性能进行了一些额外的讨论。
交互式爱情
TA贡献1712条经验 获得超3个赞
如果NOT IN不起作用,您可能总是尝试进行LEFT JOIN。然后使用连接表中的一个值(即NULL)按WHERE过滤。提供的,您加入的值不包含任何NULL值。
牛魔王的故事
TA贡献1830条经验 获得超3个赞
您还可以使用Case子句来解决此类问题
SELECT stock.IdStock ,stock.Descr FROM [Inventory].[dbo].[Stock] stockWHERE (Case when stock.IdStock IN (SELECT foreignStockId FROM [Subset].[dbo].[Products]) then 1 else 0 end) = 0
此语法适用于SQL Server,Oracle和postgres
添加回答
举报
0/150
提交
取消