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

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

Mary-Kate Olsen
发布: 2025-01-18 11:41:17
原创
778 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板