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