MS Access UPDATE查询正在添加新行

时间:2018-06-05 07:09:00

标签: sql ms-access sql-update ms-access-2010

我很难过为什么会这样。这是我在MS ACCESS中的UPDATE查询:

UPDATE TempMyTable AS b
RIGHT JOIN MyTable AS a ON (a.[ID] = b.[ID])
AND (a.T3 = b.T3) AND (a.T2 = b.T2) AND (a.T1 = b.T1)
SET b.T1 = a.T1, b.T2 = a.T2, b.T3 = a.T3
WHERE (((b.ID) Is Null));

我正在检查T1,T2和T3列的变化。如果有更改,请更新TempMyTable行中的列。 然而,正在发生的事情是在除T1,T2和T3的值之外的所有字段中添加空行的新值。

编辑:解决方案,使用INNER JOIN并检查列是否与'<>'操作

UPDATE TempMyTable AS b
INNER JOIN MyTable AS a
ON ((a.T1 <> b.T1) OR (a.T2 <> b.T2) OR (a.T3 <> b.T3))
AND (a.[ID] = b.[ID])
SET b.T1 = a.T1, b.T2 = a.T2, b.T3 = a.T3;

1 个答案:

答案 0 :(得分:1)

您使用的是RIGHT JOIN,其中包含MyTable中不存在任何内容的行。这些行正在更新(即使您只在一个表中的列上使用UPDATE,Microsoft Access中的Set查询也会在使用连接时影响两个表的行,从而创建新行。 / p>

将联接更改为INNER JOIN

UPDATE TempMyTable AS b
INNER JOIN MyTable AS a ON (a.[ID] = b.[ID])
AND (a.T3 = b.T3) AND (a.T2 = b.T2) AND (a.T1 = b.T1)
SET b.T1 = a.T1, b.T2 = a.T2, b.T3 = a.T3
WHERE (((b.ID) Is Null));

但请注意,此查询不执行任何操作,因为您正在检查WHERE (((b.ID) Is Null));,并且您正在加入b.ID。这意味着Access将无法在任何情况下返回行。您可能希望删除该WHERE子句。

最后,OP正在寻找与匹配ID的差异,因此使用了以下查询:

UPDATE TempMyTable AS b
INNER JOIN MyTable AS a
ON ((a.T1 <> b.T1) OR (a.T2 <> b.T2) OR (a.T3 <> b.T3))
AND (a.[ID] = b.[ID])
SET b.T1 = a.T1, b.T2 = a.T2, b.T3 = a.T3;