与SQL Server MERGE语句的问题(Issues with SQL Server MERG

2019-07-18 06:29发布

表源

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子句组源行。

我想从任何三个匹配值的更新地址值一列。 这该怎么做?

Answer 1:

任何在四个值的#S将匹配您的目标表中的一行值(#S所有值都具有ID = 1 name =“A” -所以他们都在目标单列匹配),因此该值将是更新四次 - 这是错误说什么,这是完全正确的。

这是什么你真的想在这里实现?

你想从源表中设置的地址,以第一的价值观? 使用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 1ORDER 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;

如果您符合四个源行到一个目标行,你永远不会得到一个有用的结果 - 你需要知道你真正想要的。



Answer 2:

使用删除dupicate

select R.* 
from  (SELECT Customer,Material,Received_date_time,
row_number() over (Partition by Customer, Material   
order by  Customer,Material,Received_date_time) as rn
      from Customer_Table WHERE Status=0     
     ) as R
where R.rn = 1

对于合并你不能有重复,所以你总是要选择最新



文章来源: Issues with SQL Server MERGE statement