没有空缺 - 行为不清楚

时间:2013-08-20 10:38:05

标签: sql sql-server tsql sql-server-2008-r2 notin

以下查询返回NO数据:

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中返回)。
所以我的问题:
  - 为什么是第一次查询无法工作
  - 有更好,更有效的方法吗?我找到了EXISTS和ANY,但是我看不到旧学校方式的任何优势。


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

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

2 个答案:

答案 0 :(得分:1)

由于比较null values,第一个查询不返回任何数据。 比较2个值时,结果可能是

  • TRUE如果等于
  • FALSE如果他们不是
  • UNKNOWN如果其中一个或两个值为空

因此,当您使用not in时,sql应将您的值glnfact与子查询中的所有GLN值进行比较,如果所有比较返回FALSE,则返回{{ 1}}表示整个TRUE子句。如果其中一个值not in为空,则将其与GLN进行比较会返回glnfact,因此UNKNOWN子句为not in

答案 1 :(得分:1)

因为你的编辑而回答

如果您要更新表Status = 2 ediImport中的NULLClientsLEFT JOIN UPDATE这样的陈述:

UPDATE ei SET ei.Status = 2
  FROM ediImport as ei
  LEFT JOIN Clients c
    ON ei.glnfact = c.gln
 WHERE c.gln IS NULL;

请参阅this sample SQLFiddle

这相当于UPDATE使用NOT IN。见this SQLFiddle