MERGE语句尝试多次更新或删除同一行

时间:2013-05-03 10:05:01

标签: sql-server-2008-r2

我有一个包含三个字段的源表

Declare @tmptvp table
(
ID int,
StartDate Datetime,
EndDate Datetime
)


Insert @tmptvp values(1,'2013-04-28','2013-04-30')
Insert @tmptvp values(2,'2013-05-01','2013-06-30')

select * from @tmptvp

My target table is 'InsertDate' contains the following data.

Insert InsertDate values(1,'2013-04-28','2013-06-30')

while merging
MERGE (@tmptvp)  as TGT
USING 
(select ID,StartDate,EndDate FROM  @tmptvp)  AS SRC
ON
(TGT.StartDate = SRC.StartDate OR TGT.EndDate = SRC.EndDate)  

WHEN MATCHED THEN
UPDATE SET TGT.StartDate = CASE WHEN SRC.StartDate < TGT.StartDate  THEN SRC.StartDate ELSE TGT.StartDate END,
TGT.EndDate   = CASE WHEN SRC.EndDate > TGT.EndDate THEN  SRC.EndDate ELSE TGT.EndDate  END, 


 WHEN NOT MATCHED THEN
 INSERT (ID,StartDate,EndDate)  
 VALUES
(SRC.ID,SRC.StartDate,SRC.EndDate);

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

有人可以帮助

1 个答案:

答案 0 :(得分:0)

请查看此网站

http://www.sqlsafety.com/?p=665

MERGE语句尝试多次更新或删除同一行。当目标行与多个源行匹配时会发生这种情况。 MERGE语句不能多次更新/删除目标表的同一行。优化ON子句以确保目标行最多匹配一个源行,或使用GROUP BY子句对源行进行分组。“多次,我总是被迫通过查询逻辑运行以查看发生了什么。阅读信息对于发生的事情是相当自我解释的。目标表中的一行将在MERGE语句中多次受到影响,导致查询失败。

祝你好运