为了账号安全,请及时绑定邮箱和手机立即绑定

SQL NOT IN不工作

SQL NOT IN不工作

守着星空守着你 2019-07-30 16:09:38
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中使用的 三值逻辑。谓词可以计算为TrueFalseUnknown

一个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根据真值表评估三值逻辑

以下链接对各种选项的性能进行了一些额外的讨论。


查看完整回答
反对 回复 2019-07-30
?
交互式爱情

TA贡献1712条经验 获得超3个赞

如果NOT IN不起作用,您可能总是尝试进行LEFT JOIN。然后使用连接表中的一个值(即NULL)WHERE过滤。提供的,您加入的值不包含任何NULL值。


查看完整回答
反对 回复 2019-07-30
?
牛魔王的故事

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


查看完整回答
反对 回复 2019-07-30
  • 3 回答
  • 0 关注
  • 1336 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信