故障排除 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
两个有效的解决方案可以避免这个问题:
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>
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中文网其他相关文章!