2

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

所以首先我使用了 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)

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

4

2 回答 2

3

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

NOT EXISTS行为如你所料。出于这个原因,我建议不要使用NOT IN子查询。始终使用NOT EXISTS.

于 2018-08-27T12:19:38.543 回答
0

那是因为NULL从返回的值subquery

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

这会产生no recordsno rows affected因此产生graphicnr not in (null)不期望的输出。

因此, theNOT EXISTS不会作为IN子句或NOT IN工作方式起作用。then INorNOT IN子句的行为不同。

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

于 2018-08-27T12:23:43.967 回答