这些是相当基本的陈述。我有一个链接到另一个表中项目的图形列表。我想检查有多少图形未使用,理论上可以删除。
所以首先我使用了 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 records
或no rows affected
,因为graphicnr not in (null)
这不是期望的输出。
因此,NOT EXISTS
不会像IN
条款或NOT IN
那样起作用。它的行为与IN
或NOT IN
子句不同。
但是,您可以通过在subquery
中使用IS NOT NULL
过滤器来防止这种情况。但推荐的方法是改用NOT EXISTS
。