MS Access UPDATE 查询正在添加新行
MS Access UPDATE query is adding new rows
我很困惑为什么会这样。这是我在 MS ACCESS 中的更新查询:
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;
您正在使用 RIGHT JOIN
,它将包括 MyTable
中不存在的行。这些行正在更新(Microsoft Access 中的 UPDATE
查询在使用联接时始终影响两个 table 的行,即使您仅在一个 [=29= 中的列上使用 Set
]), 从而创建新行。
将联接更改为 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 在任何情况下都无法 return 行。您可能希望删除该 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;
我很困惑为什么会这样。这是我在 MS ACCESS 中的更新查询:
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;
您正在使用 RIGHT JOIN
,它将包括 MyTable
中不存在的行。这些行正在更新(Microsoft Access 中的 UPDATE
查询在使用联接时始终影响两个 table 的行,即使您仅在一个 [=29= 中的列上使用 Set
]), 从而创建新行。
将联接更改为 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 在任何情况下都无法 return 行。您可能希望删除该 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;