Sql 不适用于空值-行为不明确

Sql 不适用于空值-行为不明确,sql,sql-server,tsql,sql-server-2008-r2,notin,Sql,Sql Server,Tsql,Sql Server 2008 R2,Notin,以下查询不返回任何数据: select * from ediImport WHERE glnfact NOT IN (select GLN from Clients) 经过一些搜索,我找到了我想要的数据,方法如下: select * from ediImport WHERE glnfact NOT IN (select GLN from Clients WHERE gln is not null) 但是我觉得第一个查询应该返回信息(我认为它会在Access中返回信息)。 所以我的问题是:

以下查询不返回任何数据:

select * from ediImport 
WHERE glnfact NOT IN (select GLN from Clients)
经过一些搜索,我找到了我想要的数据,方法如下:

select * from ediImport 
WHERE glnfact NOT IN (select GLN from Clients WHERE gln is not null)
但是我觉得第一个查询应该返回信息(我认为它会在Access中返回信息)。
所以我的问题是:
-为什么第一个查询不起作用
-有没有更好、更有效的方法?我发现存在和任何,但我看不出有任何优势比旧的学校的方式


注意:我不想在这里使用左连接,因为我真正需要的是执行更新:

UPDATE ediImport SET Status = 2 
WHERE glnfact NOT IN (select GLN from Clients WHERE gln is not null)

第一个查询由于比较而不返回任何数据。 当您比较两个值时,结果可能是

  • TRUE
    如果它们等于
  • FALSE
    如果它们不是
  • 未知
    如果一个或两个值为空
因此,当您使用
not in
时,sql应该将您的值
glnfact
与子查询中
GLN
的所有值进行比较,如果所有比较都返回
FALSE
,那么它将返回整个
not in
子句的
TRUE
。如果
GLN
的其中一个值为空,将其与
glnfact
进行比较将返回
UNKNOWN
,因此
不在
子句中是
UNKNOWN
由于您的编辑而应答

如果要更新表
ediImport
中的
Status=2
,该表
Clients
中的
NULL
,可以在
update
语句中使用
LEFT JOIN
,如下所示:

UPDATE ei SET ei.Status = 2
  FROM ediImport as ei
  LEFT JOIN Clients c
    ON ei.glnfact = c.gln
 WHERE c.gln IS NULL;
看见
这相当于使用
不在
中更新
。请参见检查:@AndreyGordeev:看起来不错。既然你是第一个回答这个问题的人,那么请给我一个答复,这样我就可以把它标记为答案了?@iDevlop-最好将它作为一个副本关闭???@iDevlop因为这个问题是一个副本,所以没有必要回答这个问题。虽然这不是我的主要问题,但这正好满足我的需要,可能是最有效的解决方案。谢谢