守著星空守著你
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中使用的 三值邏輯。謂詞可以計算為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
提交
取消