这些是相当基本的陈述。我有一个链接到另一个表中的项目的图形列表。我想检查有多少图形没有使用并且理论上可以删除。
所以首先我使用了 NOT IN 子句:
SELECT [GraphicNr]
,[Graphicfile]
FROM [dbo].[Graphic]
WHERE graphicnr NOT IN (SELECT graphicnr FROM dbo.Komp)
结果为零,这对我来说很奇怪。将其重写为 NOT EXISTS 后,我得到了大约 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
。
关于sql - NOT IN 不会产生与 NOT EXISTS 相同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52039152/