SQL合并错误:MERGE语句尝试更新或删除

时间:2016-10-24 11:23:12

标签: 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.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和

进行匹配
  1. 插入(如果不存在)
  2. 如果BGID匹配则更新
  3. 如果BGID不匹配则删除
  4. 当我使用SQL Merge语句时,我收到错误

      

    MERGE语句尝试多次更新或删除同一行。当目标行与多个源行匹配时会发生这种情况。 MERGE语句不能多次更新/删除目标表的同一行。优化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]
    );
    

    我错过了什么?

1 个答案:

答案 0 :(得分:7)

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

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

  

MERGE语句不能多次更新/删除目标表的同一行。

您需要指定一些唯一列组合才能加入sourcetarget表格。