此时,源表和目的地表有三列“ID'”,“ST' ST'并且'添加'。 ' ADD'允许null
使用 SQL Server合并 语句我希望将源表中所做的更改放到目标位置。 要求:
我可以通过SQL Server合并实现这一目标吗?如果没有,我们有哪些替代方案?
答案 0 :(得分:0)
尝试将st合并为唯一列并更新ID,添加具有多个记录的列
MERGE Tablex AS TARGET
USING Vw_tablex AS SOURCE
ON (TARGET.id = SOURCE.id)
WHEN MATCHED
AND
--updates only St column as unique
target.st <> source.st
THEN
UPDATE
SET
--- Inserts/updates multiple values in add column
TARGET.id = SOURCE.id
,TARGET.ADD = Source.ADD
,TARGET.st = SOURCE.st
WHEN NOT MATCHED BY TARGET
THEN
INSERT (
id
,ADD
,st
)
VALUES (
SOURCE.id
,source.ADD
,source.st
);
答案 1 :(得分:0)
MERGE
需要主键,您必须以一对一匹配的方式连接两个表。否则你会收到类似这样的错误:
MERGE语句尝试更多地更新或删除同一行 不止一次。当目标行匹配多个源时会发生这种情况 行。 MERGE语句不能更新/删除目标的同一行 表多次。优化ON子句以确保目标行 匹配最多一个源行,或使用GROUP BY子句进行分组 源行。
您的第二个要求本质上意味着密钥由两列(ID, ADD)
组成,MERGE
语句应该在两列上都加入:
MERGE INTO DstTable AS Dst
USING
(
SELECT
ID
,ST
,ADD
FROM SrcTable
) AS Src
ON Dst.ID = Src.ID
AND Dst.ADD = Src.ADD
WHEN MATCHED AND Dst.ST <> Src.ST THEN
UPDATE SET
Dst.ST = Src.ST
WHEN NOT MATCHED BY TARGET THEN
INSERT
(ID
,ST
,ADD)
VALUES
(ID
,ST
,ADD)
;
此查询几乎可以执行您想要的操作。更新ST
值并不像您所描述的那样。
- 对于源和目标中可用的任何ID,如果只有ST更改 源然后修改ST的值应该在所有行中更新 目标中的匹配ID
醇>
由于上面的查询加入了(ID, ADD)
,因此ST
的修改后的值不会更新为目标中匹配ID
的所有行,而是匹配{{1}的一行} 和 ID
。
同样,第四个要求并不是你想要的。将插入新行,但不会更新具有相同ADD
的旧行。
对于ID
的此类更新,您需要单独的ST
声明。或者单独UPDATE
和INSERT
语句,而不是UPDATE
。