3

以下查询返回 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)
4

2 回答 2

1

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

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

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

于 2013-08-20T10:45:38.773 回答
1

由于您的编辑而回答

如果要Status = 2在 table 中的 tableediImportNULL更新,Clients可以使用如下语句:LEFT JOINUPDATE

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

请参阅此示例 SQLFiddle

这相当于UPDATE使用NOT IN. 看到这个 SQLFiddle

于 2013-08-20T11:02:21.920 回答