2011-06-09 38 views
4

正在嘗試進行更新/插入......我得到的錯誤:(消息8672,16級狀態1,第1行 MERGE語句試圖更新或刪除同一行不止一次。這發生在一個目標行匹配多個源行。MERGE語句不能更新/刪除目標表多的同一行次。細分ON子句,以確保目標行至多有一個源行匹配時,或使用GROUP BY子句組源行。 )消息8672,級別16,狀態1,第1行MERGE語句試圖更新或刪除同一行不止一次

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()); 

回答

4

這發生在當一個目標行匹配多個酸ce行。
MERGE語句不能更新/刪除目標表的同一行多次。

的錯誤是不言自明的,我想。

您在源表中有重複的行。所以對於Rows表中的一行與Rownumber = X有在Temp_info表多行與Rowno = X

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作爲定義爲了瞭解現場什麼是最後的。將此字段替換爲您要用於訂購的字段。

+0

我有一個Rowno,它在臨時表中是重複的,但我想表格中最後一個重複行 – Vikram 2011-06-09 10:21:06

+0

@Vikram - 更新了答案 – 2011-06-09 15:35:29

+0

@Vikram - 它的工作原理是什麼? – 2011-06-10 17:10:17

相關問題