源表
Id, Name, Address 1 A #202 1 A #203 1 A #204 2 A #202
目标表
Id, Name, Address 1 A NULL
合并后
Id, Name, Address 1 A #202 2 A #202
我正在使用此SQL
create table #S (ID int, Name varchar(25) NULL, Address varchar(25) NULL) create table #T (ID int, Name varchar(25) NULL, Address varchar(25) NULL) INSERT #S values(1, 'A', '#202') INSERT #S values(1, 'A', '#203') INSERT #S values(1, 'A', '#203') INSERT #S values(1, 'A', '#204') INSERT #T values(1, 'A', NULL) MERGE #T USING ( Select id, name, address from #S ) AS S(id,name,address) on #T.id=S.id and #T.Name=S.Name when not matched THEN INSERT values(S.id,S.Name, S.Address) when matched then update set Address = S.Address; GO Select * from #T GO Select * from #S GO
这会导致错误
消息8672,级别16,状态1,第18行 MERGE语句尝试多次更新或删除同一行。当目标行与多个源行匹配时,就会发生这种情况。MERGE语句不能多次更新/删除目标表的同一行。优化ON子句以确保目标行最多匹配一个源行,或使用GROUP BY子句对源行进行分组。
消息8672,级别16,状态1,第18行
MERGE语句尝试多次更新或删除同一行。当目标行与多个源行匹配时,就会发生这种情况。MERGE语句不能多次更新/删除目标表的同一行。优化ON子句以确保目标行最多匹配一个源行,或使用GROUP BY子句对源行进行分组。
我想用三个匹配值中的任何一个用地址值更新A中的行。这该怎么做?
中的四个值中的任何一个#S都将与目标表的单行值匹配(#S中的所有值都具有id = 1且名称=’A’-因此它们都与目标中的单行匹配),因此此值将被更新四个次-这就是错误的意思,这是绝对正确的。
#S
您真正想要在这里实现什么?
您是否要将“地址”设置为源表中的第一个值?TOP 1在子选择中使用子句:
TOP 1
MERGE #T USING (SELECT TOP 1 id, name, address FROM #S) AS S ON #T.id = S.id AND #T.Name = S.Name WHEN NOT MATCHED THEN INSERT VALUES(S.id,S.Name, S.Address) WHEN MATCHED THEN UPDATE SET Address = S.Address;
您是否要将“地址”设置为源表中值的随机元素?在子选择中使用TOP 1andORDER BY NEWID()子句:
ORDER BY NEWID()
MERGE #T USING (SELECT TOP 1 id, name, address FROM #S ORDER BY NEWID()) AS S ON #T.id = S.id AND #T.Name = S.Name WHEN NOT MATCHED THEN INSERT VALUES(S.id,S.Name, S.Address) WHEN MATCHED THEN UPDATE SET Address = S.Address;
如果将四个源行与单个目标行匹配,则永远不会得到有用的结果-您需要知道真正想要的是什么。
马克