【问题标题】:Merge Statement throwing error合并语句抛出错误
【发布时间】:2017-12-11 19:32:03
【问题描述】:

我有一张临时表 -

   CREATE TABLE #TempMain(
      A int,
      B int,
      C int
   )

我运行以下插入仅查询一次只是为了填充#TempMain

insert into #TempMain 

        SELECT 
                      A,
                      B,
                      C
                FROM dbo.entity where RequestId = 1241 and ClassId = 25 and type=102

之后我使用 Merge 语句 -

   MERGE #TempMain AS Target
            USING (
                    SELECT 
                          A,
                          B,
                          C
                    FROM dbo.entity where RequestId = 1241 and ClassId = 25 and type=102
                  ) AS Source ON (Target.B= Source.B AND Target.C= Source.C)
            WHEN MATCHED THEN 
            UPDATE SET Target.A= Source.A
            WHEN NOT MATCHED BY Target THEN 
            INSERT (A,B,C)
            VALUES (Source.A,Source.B,Source.C);

            select * from #temp1

当我运行这个合并语句查询时,我得到一个错误 -

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

我无法理解代码中的问题。我寻找了其他类似的错误我仍然无法解决这个问题。

【问题讨论】:

    标签: sql-server merge


    【解决方案1】:

    我无法理解代码中的问题。

    很明显,B, C#TempMain 中的数据可能不是唯一的,当然dbo.entity 中也存在相同的行。因此,在加入的情况下,您将获得笛卡尔积,并且来自目标(以及来自源)的同一行存在多个。所以这个UPDATE SET Target.A= Source.A 会多次更新同一行。

    【讨论】:

    • 你认为我应该改变什么条件才能使用合并语句获得(0 行影响),因为它们都有相同的条目。
    • 我不知道你的意图。我强烈回答了您在我的回答中突出显示的问题。如果您还有其他问题,请先阅读this,然后创建格式正确的问题。
    猜你喜欢
    • 2015-01-05
    • 1970-01-01
    • 1970-01-01
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    • 2017-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多