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因为这个问题是一个副本,所以没有必要回答这个问题。虽然这不是我的主要问题,但这正好满足我的需要,可能是最有效的解决方案。谢谢