程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SyBase數據庫 >> SyBase教程 >> Sybase數據庫之ASE新版本支持MERGE語句解析

Sybase數據庫之ASE新版本支持MERGE語句解析

編輯:SyBase教程


本文章簡單介紹一下Sybase數據庫之ASE新版本支持MERGE語句解析,希望能夠幫助到這方面需要的朋友們吧,這又算是我的一次新嘗試,呵呵,如果錯誤的地方,請指正啊!     ANSI- SQL2003標准中首次提到了MERGE這個命令,簡單理解為:”向目標表中插入不存在的記錄,更新已經存在的數據“。其它數據庫管理系統,比如 Oracle在9i中就引入了MERGE命令,Sybase SQL Anywhere中也有該命令。迄今為止,Sybase ASE中只能使用類似的if update else insert的方法來實現MERGE的功能。
下面是一個使用MERGE的例子。表Customers中存儲客戶信息,每周需要將表Cust_updates_week_10中的數據更新到客戶表Customers中。為了簡化起見,本例子只更新address和number這2個字段。 merge into Customers as c                                         using Cust_updates_week_10 as u                                   on c.CustID = u.CustID                                            when not matched then                                             insert (CustID,Addr,Phone) values(u.CustID,u.Addr,u.Phone)   when matched then                                                 update set Addr=u.Addr, Phone=u.Phone   
讓我們來分析一下上面的這個SQL語句。 第1行merge into Customers as c表示Customers為目的表。 第2行using Cust_updates_week_10 as u表示Cust_updates_week_10為源數據表,被插入或更新的內容將來源於此表。 第3行指定數據行是否存在的條件,本例子為演示起見,僅指定了一個條件。on c.CustID = u.CustID將使得ASE語法解釋器對Customers和Cust_updates_week_10做左外連接處理。 第4-5行表示Cust_updates_week_10包含的並且在Customers中不存在的數據,也就是“新客戶”數據,將被插入到表Customers中。 第6行表示兩張表中的記錄匹配時,“非鍵”列可以被更新。本例子僅更新address和phone兩個字段。 我們可以拓展MERGE命令的語法,比如:可以使用多個“當存在時”、“當不存在時”這樣的語句。下面的例子將使用兩個“when matched”語句,第一個“when matched”語句判斷存在的記錄中address字段是否為空,當address為空,記錄將被刪除。 merge into Customers as c   using Cust_updates_week_10 as u   on c.CustID = u.CustID   when not matched then   insert (CustID,Addr,Phone) values(u.CustID,u.Addr,u.Phone)   when matched and u.Addr = NULL then   delete   when matched then   update set Addr=u.Addr, Phone=u.Phone  注意:語句“when matched”和“when not matched”的順序會影響處理的結果。上面的SQL語句中,第一條語句的條件被完全滿足時,後面的類似“when [not] matched”語句就不會被執行了。 MERGE 命令比較實用的地方在於它將比較復雜的多條語句集成到單條SQL語句中。不僅僅使得SQL語句更加簡潔、清晰,還能顯著得提高執行效率。使用MERGE命 令僅需訪問一次源數據表的內容,然後直接處理隔膜泵匹配的每條記錄。如果你使用單獨的insert、update、delete語句來實現類似的功能時,那麼將 至少訪問三次源數據表的內容。 MERGE命令比較靈活些,除了使用基表外,還可以使用派生表。 merge into Customers as c   using (select CustID, Addr, Phone from Cust_updates_week_10   where Phone is not NULL) as u   on c.CustID = u.CustID   when not matched then   insert (CustID,Addr,Phone) values(u.CustID,u.Addr,u.Phone   when matched then   update set Addr=u.Addr, Phone=u.Phone  MERGE命令有一些限制條件,比如上面的SQL語句中,第3行中的鍵列(CustID)不能被更新。當然,還有其它的一些限制。讓我們期待ASE V15.7版本的發布。       作者 dongmiao158

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved