首页 >数据库 >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