SQL NOT IN
運算子:預期與實際
SQL 中的 NOT IN
運算子常常會帶來挑戰。本文探討了一個 NOT IN
預期功能似乎失效的場景,分析了問題並提供了替代方案。
假設存在兩個資料庫,一個包含主要庫存,另一個包含這些記錄的子集。一個使用 NOT IN
的查詢試圖找出這兩個資料庫之間的差異:
<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>
然而,此查詢未能提供預期的結果。它排除了所有記錄,即使子集資料庫中存在記錄。資料的缺失引發了一個問題:「哪裡出錯了?」
答案在於子集資料庫中可能存在 NULL 值。當遇到 NULL 值時,NOT IN
查詢將計算為 NULL,導致這些記錄被排除。此行為源自於 SQL 使用的三值邏輯,其中謂詞可以傳回 True、False 或 Unknown。
為了修正這個問題,可以考慮兩種替代方法:
使用 IS NOT 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
:
<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>
這兩種方法都能有效地處理 NULL 值,確保只進行有效的比較。後者使用 NOT EXISTS
的方法通常透過簡化執行計劃來提供更好的效能。
記住,在處理 SQL 中的 NULL 值時,請務必考慮三值邏輯並採用適當的技術來避免意外結果。
以上是為什麼我的 SQL'NOT IN”查詢傳回意外結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!