消息8672,级别16,状态1,行1 MERGE语句尝试多次更新或删除同一行

时间:2011-06-09 07:45:00

标签: sql sql-server tsql sql-server-2008 merge

我试图执行更新/插入...我收到错误:(消息8672,级别16,状态1,行1 MERGE语句尝试多次更新或删除同一行。当目标行与多个源行匹配时会发生这种情况。 MERGE语句不能多次更新/删除目标表的同一行。优化ON子句以确保目标行最多匹配一个源行,或使用GROUP BY子句对源行进行分组。 )

Merge into Rows as R
USING (select RowNo,DOB,Pin,State,RowType,RowStatus from Temp_info) as tmp
ON R.Rownumber=tmp.Rowno
WHEN MATCHED THEN 
UPDATE 
    SET R.DOB=tmp.DOB,
    R.Pin=tmp.Pin,
    R.State=tmp.State,
    R.RowType=tmp.RowType,
    R.RowStatus=tmp.RowStatus,
    R.deleted='N',
    R.last_modified=getdate()
WHEN NOT MATCHED THEN 
INSERT (RowNumber,DOB,Pin,State,RowType,RowStatus,deleted,last_modified)
values (tmp.RowNo,tmp.DOB,tmp.Pin,tmp.State,tmp.RowType,tmp.RowStatus,'N',GETDATE());

1 个答案:

答案 0 :(得分:4)

当目标行与多个源行匹配时会发生这种情况 MERGE语句不能多次更新/删除目标表的同一行。

我认为错误是不言自明的。

源表中有重复的行。因此,对于Rownumber = X表中Rows的一行,Rowno = X表中有多行Temp_info

SQL服务器想知道源表中那些重复行中的哪一行用于目标表中一行的更新。

[编辑]

回答你的回答:其中一个选项是重复,然后再运行合并:

with cte
as
(
    select row_number() over(partition by RowNo order by DOB desc) RowNumber
    from Temp_info
)
delete cte
where RowNumber > 1

我使用DOB作为定义顺序以知道最后一个的字段。将此字段替换为您要用于订单的字段。