首页 >数据库 >mysql教程 >为什么我的 SQL'NOT IN”查询返回意外结果?

为什么我的 SQL'NOT IN”查询返回意外结果?

Mary-Kate Olsen
Mary-Kate Olsen原创
2025-01-18 11:41:17829浏览

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