Sql server SQL合并错误:合并语句试图更新或删除
我有一个源表Sql server SQL合并错误:合并语句试图更新或删除,sql-server,tsql,merge,Sql Server,Tsql,Merge,我有一个源表 select 54371 Id, 'foo' [CreateBy], '2016-10-24 09:29:18.548'[CreateDate], 'foo'[UpdateBy], '2016-10-24 09:29:18.548'[UpdateDate], 'E'[MT], 185761[MID], 3[BGID] union select 54372, 'foo', '2016-10-24 09:30:18.548', 'foo', '2016-10-24 09:30:18
select 54371 Id, 'foo' [CreateBy], '2016-10-24 09:29:18.548'[CreateDate], 'foo'[UpdateBy], '2016-10-24 09:29:18.548'[UpdateDate], 'E'[MT], 185761[MID], 3[BGID]
union
select 54372, 'foo', '2016-10-24 09:30:18.548', 'foo', '2016-10-24 09:30:18.548', 'E', 185761, 2
和一个目标表
select 54379 Id, 'foo' [CreateBy], '2016-10-24 09:29:18.548'[CreateDate], 'foo'[UpdateBy], '2016-10-24 10:29:18.548'[UpdateDate], 'E'[MT], 185761[MID], 3[BGID]
我想要的是基于MT、MID和
MERGE
FooBar AS target
USING
(
SELECT
E.[Id],
E.[CreateBy],
E.[CreateDate],
E.[UpdateBy],
E.[UpdateDate],
E.[MT],
E.[MID],
E.[BGID]
FROM @FooBar E
) AS source
ON
source.MID = target.MID
AND source.MT = target.MT
WHEN MATCHED and target.[BGID] = source.[BGID] THEN
UPDATE SET
target.[UpdateBy] = Source.[UpdateBy]
,target.[UpdateDate] = Source.[UpdateDate]
When Matched and source.BGID <> target.BGID THEN
DELETE
WHEN NOT MATCHED THEN
INSERT([CreateBy]
,[CreateDate]
,[UpdateBy]
,[UpdateDate]
,[MT]
,[MID]
,[BGID])
VALUES
(
Source.[CreateBy]
,Source.[CreateDate]
,Source.[UpdateBy]
,Source.[UpdateDate]
,Source.[MT]
,Source.[MID]
,Source.[BGID]
);
合并
以福巴为目标
使用
(
挑选
E.[Id],
E.[CreateBy],
E.[CreateDate],
E.[更新日期],
E.[更新日期],
E.[MT],
E.[中期],
E.[BGID]
来自@FooBar E
)作为来源
在…上
source.MID=target.MID
和source.MT=target.MT
当与目标匹配时。[BGID]=源。[BGID]然后
更新集
目标。[UpdateBy]=源。[UpdateBy]
,目标。[UpdateDate]=源。[UpdateDate]
如果与source.BGID target.BGID匹配,则
删除
当不匹配时
插入([CreateBy]
,[CreateDate]
,[UpdateBy]
,[更新日期]
,[MT]
,[中]
,[BGID])
价值观
(
来源。[CreateBy]
,来源。[CreateDate]
,来源。[UpdateBy]
,来源。[更新日期]
,资料来源。[MT]
,资料来源。[中]
,来源。[BGID]
);
我缺少什么?您正在加入source.MappingId=target.MappingId的
上的表
在数据示例中,有多行具有相同的MappingId=185761
。
这就是你得到的:
MERGE语句不能多次更新/删除目标表的同一行
您需要指定一些唯一的列组合来加入源
和目标
表。删除了MySQL
标记,因为问题与SQL Server
相关。发布问题时请不要使用不相关的标签。请检查此帖子一次,谢谢。这解决了我的问题!:)如果在
上使用GROUP BY
子句而不是,则不需要指定唯一的列组合。Harvey,这是什么意思?您可以在源部件中使用groupby
f.e.,但无论如何,在merge
语句中,您需要on
来指定合并选择条件。