1

我正在比较两个表 A 和 B。A 和 B 是月份(我们将使用 JAN 和 FEB)。FEB 更新了属于 JAN 的数据。

我需要像这样更新数据

UPDATE A
SET A.x = B.x, A.y = B.y, A.z = B.z
FROM JAN A, FEB B
WHERE (A.x <> B.x OR A.y <> B.y OR A.z <> B.z) AND A.PK = B.PK

现在我希望上述内容不会发生在原始 JAN 表上。我应该这样做吗?或者,还有更好的方法?

SELECT *
INTO JAN_UPDATED
FROM JAN

UPDATE A
SET A.x = B.x, A.y = B.y, A.z = B.z
FROM JAN_UPDATED A, FEB B
WHERE (A.x <> B.x OR A.y <> B.y OR A.z <> B.z) AND A.PK = B.PK

编辑:我想要所有原始值+新表中的更新

编辑:添加PK

4

2 回答 2

2

使用外连接,您可以将数据选择到新表中在此过程中更新它们。就是这样:

SELECT    A.PK,
          COALESCE(B.x, A.x) AS x,
          COALESCE(B.y, A.y) AS x,
          COALESCE(B.z, A.z) AS x,
          other columns as necessary
INTO      JAN_UPDATED
FROM      JAN A
LEFT JOIN FEB B ON A.PK = B.PK AND (A.x <> B.x OR A.y <> B.y OR A.z <> B.z)

连接的左侧部分,即JAN表,将返回所有JAN行,而连接的右侧部分FEB,将只返回匹配的行,即那些与 中的对应项不同的行JAN。当没有匹配时,右边部分的列将用NULLs 填充。现在,在拉取值时,该COALESCE()函数用于x, y, 和zFEB首先尝试版本,如果是NULL(意味着这是一个不匹配的JAN行,在 中没有更新的行FEB),那么JAN当事方(未更改的行)值)来代替。

于 2012-05-31T20:11:07.353 回答
1

如果您需要原始记录和更新的记录,那么您遵循的方法是正确的。

我们不能遵循任何其他方法,因为表上没有定义主键。

您的解决方案还具有模糊逻辑,因为它可以更新错误的记录。

于 2012-05-31T15:19:28.357 回答