故障排除 NOT IN
查詢和 NULL 值
當查詢資料庫以尋找子集中不存在的記錄時,使用 NOT IN
可能會產生意外的空結果。 當子查詢包含 NULL 值時,通常會發生這種情況。
問題:NOT IN
和 NULL
考慮這個 SQL 查詢,旨在從 [Inventory].[dbo].[Stock]
檢索 不 存在於 [Subset].[dbo].[Products]
:
<code class="language-sql">SELECT stock.IdStock, stock.Descr FROM [Inventory].[dbo].[Stock] stock WHERE stock.IdStock NOT IN (SELECT foreignStockId FROM [Subset].[dbo].[Products])</code>
如果 foreignStockId
包含 NULL,則即使存在匹配,此查詢也可能不傳回任何行。 這是由於SQL的三值邏輯; 與 NULL 的比較結果為 UNKNOWN
,影響 NOT IN
評估。
解:處理 NULL
兩個有效的解決方案可以避免這個問題:
IS NOT NULL
修改子查詢以排除 NULL:<code class="language-sql">SELECT stock.IdStock, stock.Descr FROM [Inventory].[dbo].[Stock] stock WHERE stock.IdStock NOT IN (SELECT foreignStockId FROM [Subset].[dbo].[Products] WHERE foreignStockId IS NOT NULL)</code>
NOT EXISTS
: 將 NOT IN
替換為 NOT EXISTS
以獲得更有效率、更清晰的方法:<code class="language-sql">SELECT stock.idstock, stock.descr FROM [Inventory].[dbo].[Stock] stock WHERE NOT EXISTS (SELECT * FROM [Subset].[dbo].[Products] p WHERE p.foreignstockid = stock.idstock)</code>
表現:
NOT EXISTS
通常會產生更簡單的執行計劃,可能會帶來更好的效能,尤其是在處理 NULL 時。
進一步閱讀:
要更深入地比較解決此問題的不同方法,包括 LEFT JOIN
和其他替代方案,請參閱以下資源:
以上是為什麼當存在 NULL 值時我的 SQL'NOT IN”查詢會失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!