首頁 >資料庫 >mysql教程 >為什麼當存在 NULL 值時我的 SQL'NOT IN”查詢會失敗?

為什麼當存在 NULL 值時我的 SQL'NOT IN”查詢會失敗?

DDD
DDD原創
2025-01-18 11:26:12819瀏覽

Why Do My SQL `NOT IN` Queries Fail When NULL Values Are Present?

故障排除 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

兩個有效的解決方案可以避免這個問題:

  1. 從子查詢中過濾 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>
  1. 使用 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中文網其他相關文章!

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