以下查询返回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)
答案 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
中的NULL
,Clients
,LEFT 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;
这相当于UPDATE
使用NOT IN
。见this SQLFiddle