SQL 合并错误:MERGE 语句试图更新或删除 [重复]

Posted

技术标签:

【中文标题】SQL 合并错误:MERGE 语句试图更新或删除 [重复]【英文标题】:SQL Merge Error : The MERGE statement attempted to UPDATE or DELETE [duplicate] 【发布时间】:2017-03-06 03:43:42 【问题描述】:

我有一个源表

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 和

    如果不存在则插入 如果 BGID 匹配则更新 如果 BGID 不匹配则删除

当我使用 SQL 合并语句时出现错误

MERGE 语句多次尝试更新或删除同一行。当目标行匹配多个源行时会发生这种情况。 MERGE 语句不能多次 UPDATE/DELETE 目标表的同一行。优化 ON 子句以确保目标行最多匹配一个源行,或使用 GROUP BY 子句对源行进行分组。`

我的合并是这样的

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]
);

我错过了什么?

【问题讨论】:

删除了mysql 标签,因为问题与SQL Server 有关。请不要在发布问题时使用不相关的标签。 查看此帖一次***.com/questions/1434028/… 【参考方案1】:

您正在加入ON source.MappingId = target.MappingId 上的表格。

在您的数据样本中,有超过 1 行具有相同的 MappingId = 185761。 所以你得到了:

MERGE 语句不能多次 UPDATE/DELETE 目标表的同一行。

您需要指定一些独特的列组合来加入sourcetarget 表。

【讨论】:

谢谢。这解决了我的解决方案! :) 如果使用GROUP BY 子句而不是ON,则不需要指定唯一的列组合 @Harvey 你什么意思?您可以使用group by f.e.在源代码部分,但无论如何在merge 语句中,您将需要on 来指定合并选择条件。

以上是关于SQL 合并错误:MERGE 语句试图更新或删除 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server2008中的MERGE SQL语句中的MERGE的全称是什麼?代表什麼意思? 有没有

为啥 MERGE 语句会抛出唯一键约束错误

将 MERGE 语句的更新列审计为不同表中的行

DB2 中的合并查询

MS SQL 技巧总结--持续更新

Oracle MERGE语句