Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 更新表,但创建新的更新表?_Sql - Fatal编程技术网

Sql 更新表,但创建新的更新表?

Sql 更新表,但创建新的更新表?,sql,Sql,我正在比较A表和B表。A表和B表都是月份(我们将使用1月和2月)。 二月更新了属于一月的数据 我需要像这样更新数据 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 更新A 设置A.x=B.x,A.y=B.y,A.z=B.z 从1月A日到2月B日 其中(A.x

我正在比较A表和B表。A表和B表都是月份(我们将使用1月和2月)。 二月更新了属于一月的数据

我需要像这样更新数据

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
更新A
设置A.x=B.x,A.y=B.y,A.z=B.z
从1月A日到2月B日
其中(A.x B.x或A.y B.y或A.z B.z)和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
选择*
进入JAN_更新
从一月开始
更新
设置A.x=B.x,A.y=B.y,A.z=B.z
从1月更新到2月
其中(A.x B.x或A.y B.y或A.z B.z)和A.PK=B.PK
编辑:我想要新表中的所有原始值+更新


编辑:添加主键

如果您需要原始记录和更新记录,则您采用的方法是正确的

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


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

使用外部联接,您可以将数据选择到一个新表中,并在此过程中进行更新。以下是方法:

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)
选择A.PK,
合并(B.x,A.x)为x,
合并(B.y,A.y)为x,
合并(B.z,A.z)为x,
其他必要的栏目
进入JAN_更新
从一月一日起
在A.PK=B.PK和(A.x B.x或A.y B.y或A.z B.z)上左连接FEB B

联接的左侧部分,即
JAN
表,将返回所有
JAN
行,而联接的右侧部分,
FEB
将只返回匹配行,这些行与
JAN
中的对应行不同。当不匹配时,右侧部分的列将填充
NULL
s。现在,在提取值时,
COALESCE()
函数用于
x
y
z
:首先尝试
FEB
版本,如果它是
NULL
(意味着这是不匹配的
JAN
行,在
FEB
中没有更新的行),那么
JAN
方(未更改的值)改为使用。

此副本会覆盖整个表吗?就像在a的完整副本中加上更新一样?它只会更新1月的更新。如果您还需要原始值,则您的解决方案是完美的。好的,谢谢。很高兴我做对了。从某种意义上说,我想保留原始表的备份。如果您创建新答案,我会将其标记为正确。FEB值是如何输入到JAN_更新的?或者是如何被FEB值覆盖的?还应该有一个关键列或一组列,这样您就可以知道要将哪个
FEB
行与哪个
JAN
行进行比较。实际上,您正在将
JAN
的任何行与的任何行进行比较e> 2月,我预计可能会有(太多)个匹配项(三列中至少有一列的行不同)。也就是说,您的条件可能如下所示:
,其中A.key=B.key和(A.x B.x或…)