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

标签 sql sql-server t-sql three-valued-logic

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

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

相关文章:

SQL Azure 联合数据库备份

SQL - 创建 SQL 以加入列表

mysql - 删除重复条目

mysql - 从以某些字符为界的 MySQL 列中提取多个文本实例

c++ - SQLite 字符转换

sql - 默认约束导致错误

Sql Server通过tsql更改所有索引的填充因子值

sql-server - 为什么合并命令有时会出现错误 `Attempting to set a non-NULL-able column' s value to NULL`?

sql-server - 无法为数据库 '<temporary system object: 422212632707072>' 中的对象 'tempdb' 分配空间,因为 'PRIMARY' 文件组已满

sql - Azure SQL : Invalid Object Name using Powershell's "Invoke-sqlcmd" on Adventureworks