合并语句抛出错误

时间:2017-12-11 19:32:03

标签: sql-server merge

我有临时表 -

   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语句不能多次更新/删除目标表的同一行。优化ON子句以确保目标行最多匹配一个源行,或使用GROUP BY子句对源行进行分组。

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

1 个答案:

答案 0 :(得分:0)

  

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

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