簡體   English   中英

SQL Server MERGE語句的問題

[英]Issues with SQL Server MERGE statement

來源表

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 

這會導致錯誤

Msg 8672,Level 16,State 1,Line 18
MERGE語句嘗試多次更新或刪除同一行。 當目標行與多個源行匹配時會發生這種情況。 MERGE語句不能多次更新/刪除目標表的同一行。 優化ON子句以確保目標行最多匹配一個源行,或使用GROUP BY子句對源行進行分組。

我想從三個匹配值中的任何一個更新A中的行與地址值。 這該怎么做?

#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;

如果將四個源行匹配到單個目標行,則永遠不會得到有用的結果 - 您需要知道自己真正想要的是什么。

刪除重復使用

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

合並你不能有重復,所以你總是要拿起最新的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM