Vik*_*ram 5 sql t-sql sql-server merge sql-server-2008
我试图执行更新/插入...我得到错误:(消息8672,级别16,状态1,行1)MERGE语句尝试多次更新或删除同一行.当目标行匹配时会发生这种情况MERGE语句不能多次UPDATE/DELETE目标表的同一行.优化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());
Run Code Online (Sandbox Code Playgroud)
当目标行与多个源行匹配时,就会发生这种情况。
MERGE 语句不能多次更新/删除目标表的同一行。
我认为这个错误是不言自明的。
源表中有重复的行。Rownumber = X因此,对于表中的一行,表中Rows有不止一行。Rowno = XTemp_info
SQL Server 希望知道源表中那些重复行中的哪一行用于更新目标表中的一行。
[编辑]
回应您的回答:选项之一是在运行合并之前进行复制:
with cte
as
(
select row_number() over(partition by RowNo order by DOB desc) RowNumber
from Temp_info
)
delete cte
where RowNumber > 1
Run Code Online (Sandbox Code Playgroud)
我用作DOB定义顺序的字段来了解最后一个是什么。将此字段替换为您想要用于订单的字段。
| 归档时间: |
|
| 查看次数: |
6981 次 |
| 最近记录: |