我在下圖中有這張桌子。我正在嘗試選擇 DestinationSystemID 為“11”的所有行,其中具有相同 SupplierPartyID 的其他行也沒有 DestinationSystemID“16”。
例如,在下表中,應選擇以下行,因為它們的行的 DestinationSystem 為 11,但不是 16:
- 7300009017706
- 7300009043088
- 7330509000502
不應選擇以下選項,因為它同時具有 DestinationSystemID 11 和 16:
- 7318270000006
我希望你明白我想在這里問什么。

我已嘗試搜索解決方案,但無法正確查詢問題以找到解決方案。
uj5u.com熱心網友回復:
NOT EXISTS對此非常有效:
SELECT {explicit t.columns}
FROM dbo.YourTableName AS t
WHERE t.DestinationSystemID = 11
AND NOT EXISTS
(
SELECT 1 FROM dbo.YourTableName AS t2
WHERE t2.SupplierPartyID = t.SupplierPartyID
AND t2.DestinationSystemID = 16
);
有些人會提出建議NOT IN,但我堅信這是一個低劣的解決方案,可能會導致新用戶誤入歧途。
這就是為什么您NOT IN通常應該避免的原因,即使在這種特定情況下,該列今天NULL也無法使用。讀者將采用該“作業”解決方案并將其應用于其他場景,或者當該列稍后出現時發現許多損壞的查詢。評論中提到了這篇博文中更詳細的背景。NOT NULL
uj5u.com熱心網友回復:
NOT IN也可以將此作為另一種選擇:
SELECT * FROM test a
WHERE DestinationSystemID = 11
AND SupplierPartyID NOT IN (SELECT SupplierPartyID
FROM test b
WHERE a.SupplierPartyID = a.SupplierPartyID
AND b.DestinationSystemID = 16)
在這里拉小提琴。
注意:如果目標列接受值,請考慮使用NOT EXISTSover (請參閱上面的接受的答案)。NOT INNULL
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/521477.html
標籤:sqlsql服务器
上一篇:ConcurrentBag<T>與list<T>的用法
下一篇:SqlServer,多條件更新
