首頁 >資料庫 >mysql教程 >為什麼我的 SQL'NOT IN”查詢傳回意外結果?

為什麼我的 SQL'NOT IN”查詢傳回意外結果?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-01-18 11:41:17779瀏覽

Why Does My SQL `NOT IN` Query Return Unexpected Results?

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn