Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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 server SQL合并错误:合并语句试图更新或删除_Sql Server_Tsql_Merge - Fatal编程技术网

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和

  • 如果不存在,请插入
  • 如果BGID匹配,则更新
  • 如果BGID不匹配,则删除
  • 当我使用SQL合并语句时,我得到一个错误

    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]
    );
    
    合并
    以福巴为目标
    使用
    (
    挑选
    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
    来指定合并选择条件。