猿问

SQL NOT IN不工作

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并不会返回任何结果。

我做错了什么,有什么想法吗?


守着星空守着你
浏览 1337回答 3
3回答

斯蒂芬大帝

SELECT&nbsp;foreignStockIdFROM&nbsp;&nbsp;&nbsp;[Subset].[dbo].[Products]可能会返回一个NULL。一NOT IN如有查询将不会返回任何行NULL中的列表中存在小号NOT IN值。您可以使用IS NOT NULL以下方式明确排除它们。SELECT&nbsp;stock.IdStock, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stock.DescrFROM&nbsp;&nbsp;&nbsp;[Inventory].[dbo].[Stock]&nbsp;stockWHERE&nbsp;&nbsp;stock.IdStock&nbsp;NOT&nbsp;IN&nbsp;(SELECT&nbsp;foreignStockId&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FROM&nbsp;&nbsp;&nbsp;[Subset].[dbo].[Products] &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHERE&nbsp;&nbsp;foreignStockId&nbsp;IS&nbsp;NOT&nbsp;NULL)或者NOT EXISTS改为使用。SELECT&nbsp;stock.idstock, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stock.descrFROM&nbsp;&nbsp;&nbsp;[Inventory].[dbo].[Stock]&nbsp;stockWHERE&nbsp;&nbsp;NOT&nbsp;EXISTS&nbsp;(SELECT&nbsp;* &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FROM&nbsp;&nbsp;&nbsp;[Subset].[dbo].[Products]&nbsp;p&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHERE&nbsp;&nbsp;p.foreignstockid&nbsp;=&nbsp;stock.idstock)除了拥有您想要的语义之外,执行计划NOT EXISTS通常更简单,如此处所示。行为差异的原因归结为SQL中使用的&nbsp;三值逻辑。谓词可以计算为True,False或Unknown。一个WHERE子句必须求值True以便返回行,但是NOT IN如果NULL存在则不可能,如下所述。'A' NOT IN ('X','Y',NULL)&nbsp;相当于&nbsp;'A' <> 'X' AND 'A' <> 'Y' AND 'A' <> NULL)'A'<>'X'=&nbsp;True'A'<>'Y'=&nbsp;True'A'<> NULL =&nbsp;UnknownTrue AND True AND UnknownUnknown根据真值表评估三值逻辑。以下链接对各种选项的性能进行了一些额外的讨论。我应该使用NOT IN,OUTER APPLY,LEFT OUTER JOIN,EXCEPT,或NOT EXISTS?NOT INvs.&nbsp;NOT EXISTSvs.:SQL&nbsp;LEFT JOIN / IS NULLServerLeft outer join&nbsp;VS&nbsp;NOT EXISTSNOT EXISTS&nbsp;VS&nbsp;NOT IN

交互式爱情

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

牛魔王的故事

您还可以使用Case子句来解决此类问题SELECT&nbsp;&nbsp;stock.IdStock&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,stock.Descr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM&nbsp;&nbsp;&nbsp;&nbsp;[Inventory].[dbo].[Stock]&nbsp;stockWHERE&nbsp;&nbsp;&nbsp;(Case&nbsp;when&nbsp;stock.IdStock&nbsp;IN &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(SELECT&nbsp;foreignStockId&nbsp;FROM &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[Subset].[dbo].[Products])&nbsp;then&nbsp;1&nbsp;else&nbsp;0&nbsp;end)&nbsp;=&nbsp;0此语法适用于SQL Server,Oracle和postgres
随时随地看视频慕课网APP
我要回答