更新表,但制作新的更新表?

时间:2012-05-31 15:17:41

标签: sql

我正在比较两个表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

2 个答案:

答案 0 :(得分: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中的同行不同。如果没有匹配项,则右侧部分的列将填充NULL s。现在,在提取值时,COALESCE()函数用于xyz:首先尝试FEB版本,如果是NULL(意味着这是一个不匹配的JAN行,FEB中没有更新的行,然后使用JAN方(未更改的值)

答案 1 :(得分:1)

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

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

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