NOT IN 不会产生与 NOT EXISTS 相同的结果



这些是相当基本的陈述。我有一个链接到另一个表中项目的图形列表。我想检查有多少图形未使用,理论上可以删除。

所以首先我使用了 NOT IN 子句:

SELECT [GraphicNr]
,[Graphicfile]
FROM [dbo].[Graphic]
WHERE graphicnr NOT IN (SELECT graphicnr FROM dbo.Komp)

结果为零,这对我来说似乎很奇怪。将其重写为不存在后,我得到了大约 600 个结果:

SELECT [GraphicNr]
,[Graphicfile]
FROM [dbo].[Graphic] a
WHERE NOT EXISTS (SELECT graphicnr FROM dbo.komp b WHERE a.GraphicNr = b.GraphicNr)

所以我想我真的没有问题,因为第二个陈述有效,但据我了解,第一个不应该给出相同的结果吗?

带有子查询的NOT IN具有奇怪的行为。 如果子查询中的任何行返回NULL值,则不返回任何行。 这是由于遵循NULL的严格语义(这意味着:"我不知道它们是否相等"(。

NOT EXISTS的行为符合您的预期。 因此,我建议永远不要将NOT IN与子查询一起使用。 始终使用NOT EXISTS

因为从subquery返回NULL值:

SELECT [GraphicNr], [Graphicfile]
FROM [dbo].[Graphic]
WHERE graphicnr NOT IN (SELECT graphicnr FROM dbo.Komp)

这将产生no recordsno rows affected,因为graphicnr not in (null)这不是期望的输出。

因此,NOT EXISTS不会像IN条款或NOT IN那样起作用。它的行为与INNOT IN子句不同。

但是,您可以通过在subquery中使用IS NOT NULL过滤器来防止这种情况。但推荐的方法是改用NOT EXISTS

最新更新