星期四, 9月 05, 2013

Sybase ASE V15.7中增加Merge的特性

[轉載]

Ref: http://database.51cto.com/art/201108/287767.htm

 

20119月,Sybase公司將發佈ASE的下一個版本V15.7。即將推出的 ASE V15.7中增加了很多的新特性。本文我們只介紹一下MERGE特性的使用,希望能夠對您有所幫助。
ANSI- SQL2003
標準中首次提到了MERGE這個命令,簡單理解為:"向目標表中插入不存在的記錄,更新已經存在的資料"。其它資料庫管理系統,比如 Oracle9i中就引入了MERGE命令,Sybase SQL Anywhere中也有該命令。迄今為止,Sybase ASE中只能使用類似的if update else insert的方法來實現MERGE的功能。
下面是一個使用MERGE的例子。表Customers中存儲客戶資訊,每週需要將表Cust_updates_week_10中的資料更新到客戶表Customers中。為了簡化起見,本例子只更新addressnumber2個欄位。



merge into Customers as c                                       

1.     using Cust_updates_week_10 as u                                  
on c.CustID = u.CustID                                          

2.     when not matched then                                            
insert (CustID,Addr,Phone) values(u.CustID,u.Addr,u.Phone)  

3.     when matched then                                                

4.     update set Addr=u.Addr, Phone=u.Phone   


讓我們來分析一下上面的這個SQL語句。
1merge into Customers as c表示Customers為目的表。
2using Cust_updates_week_10 as u表示Cust_updates_week_10為來源資料表,被插入或更新的內容將來源於此表。
3行指定資料行是否存在的條件,本例子為演示起見,僅指定了一個條件。on c.CustID = u.CustID將使得ASE語法解譯器對CustomersCust_updates_week_10做左外連接處理。
4-5行表示Cust_updates_week_10包含的並且在Customers中不存在的資料,也就是"新客戶"資料,將被插入到表Customers中。
6行表示兩張表中的記錄匹配時,"非鍵"列可以被更新。本例子僅更新addressphone兩個欄位。
我們可以拓展MERGE命令的語法,比如:可以使用多個"當存在時"、"當不存在時"這樣的語句。下面的例子將使用兩個"when matched"語句,第一個"when matched"語句判斷存在的記錄中address欄位是否為空,當address為空,記錄將被刪除。



merge into Customers as c  

1.     using Cust_updates_week_10 as u  
on c.CustID = u.CustID  

2.     when not matched then  
insert (CustID,Addr,Phone) values(u.CustID,u.Addr,u.Phone)  

3.     when matched and u.Addr = NULL then  
delete  

4.     when matched then  

5.     update set Addr=u.Addr, Phone=u.Phone 


注意:語句"when matched"和"when not matched"的順序會影響處理的結果。上面的SQL語句中,第一條語句的條件被完全滿足時,後面的類似"when [not] matched"語句就不會被執行了。
MERGE
命令比較實用的地方在於它將比較複雜的多條語句集成到單條SQL語句中。不僅僅使得SQL語句更加簡潔、清晰,還能顯著得提高執行效率。使用MERGE 令僅需訪問一次來源資料表的內容,然後直接處理匹配的每條記錄。如果你使用單獨的insertupdatedelete語句來實現類似的功能時,那麼將 至少訪問三次來源資料表的內容。
MERGE
命令比較靈活些,除了使用基表外,還可以使用派生表。



merge into Customers as c  

1.     using (select CustID, Addr, Phone from Cust_updates_week_10  
where Phone is not NULL) as u  

2.     on c.CustID = u.CustID  
when not matched then  

3.     insert (CustID,Addr,Phone) values(u.CustID,u.Addr,u.Phone  
when matched then  

4.     update set Addr=u.Addr, Phone=u.Phone 


MERGE
命令有一些限制條件,比如上面的SQL語句中,第3行中的鍵列(CustID)不能被更新。當然,還有其它的一些限制。讓我們期待ASE V15.7版本的發佈。
關於Sybase ASE V15.7的相關知識就介紹這麼多了,希望本次的介紹能夠對您有所幫助

沒有留言:

LinkWithin-相關文件

Related Posts Plugin for WordPress, Blogger...