日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
詳解SQLServer2008中的MERGE語句

SQL Server 2008中的MERGE語句能做很多事情,它的功能是根據(jù)源表對目標表執(zhí)行插入、更新或刪除操作。最典型的應用就是進行兩個表的同步。

我們注重客戶提出的每個要求,我們充分考慮每一個細節(jié),我們積極的做好網(wǎng)站設(shè)計制作、成都網(wǎng)站設(shè)計服務(wù),我們努力開拓更好的視野,通過不懈的努力,創(chuàng)新互聯(lián)建站贏得了業(yè)內(nèi)的良好聲譽,這一切,也不斷的激勵著我們更好的服務(wù)客戶。 主要業(yè)務(wù):網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)站設(shè)計,微信平臺小程序開發(fā),網(wǎng)站開發(fā),技術(shù)開發(fā)實力,DIV+CSS,PHP及ASP,ASP.Net,SQL數(shù)據(jù)庫的技術(shù)開發(fā)工程師。

下面通過一個簡單示例來演示MERGE語句的使用方法,假設(shè)數(shù)據(jù)庫中有兩個表Product及ProductNew,我們的任務(wù)是將Product的數(shù)據(jù)同步到ProductNew(當然同步可能是每天通過Job來自動完成的,在此我們只關(guān)注MERGE的使用)。

以下SQL創(chuàng)建示例表

--源表

 
 
 
  1. CREATE TABLE Product 
  2.     ProductID    varchar(7) NOT NULL PRIMARY KEY, 
  3.     ProductName varchar(100) NOT NULL, 
  4.     Price        decimal(13,2) DEFAULT 0 
  5. );
  6. INSERT INTO Product 
  7.     Values 
  8.     ('4100037','優(yōu)盤',50), 
  9.     ('4100038','鼠標',30);

--目標表

 
 
 
  1. CREATE TABLE ProductNew 
  2.     ProductID    varchar(7) NOT NULL PRIMARY KEY, 
  3.     ProductName varchar(100) NOT NULL, 
  4.     Price        decimal(13,2) DEFAULT 0 
  5. );

下面再來關(guān)注MERGE語句的基本語法:

 
 
 
  1. MERGE 目標表
  2. USING 源表
  3. ON 匹配條件
  4. WHEN MATCHED THEN
  5. 語句
  6. WHEN NOT MATCHED THEN
  7. 語句;

以上是MERGE的最最基本的語法,語句執(zhí)行時根據(jù)匹配條件的結(jié)果,如果在目標表中找到匹配記錄則執(zhí)行WHEN MATCHED THEN后面的語句,如果沒有找到匹配記錄則執(zhí)行WHEN NOT MATCHED THEN后面的語句。注意源表可以是表,也可以是一個子查詢語句。

格外強調(diào)一點,MERGE語句***的分號是不能省略的!

回到我們的示例,顯然Product與ProductNew表的MERGE匹配條件為主鍵ProductID字段,初始情況下,ProductNew表為空,此時肯定執(zhí)行的是WHEN NOT MATCHED THEN后的語句,我們先只考慮源表遞增的情況,MERGE語句如下:

 
 
 
  1. MERGE ProductNew AS d 
  2. USING 
  3.     Product 
  4. AS s 
  5. ON s.ProductID = d.ProductId 
  6.     WHEN NOT MATCHED THEN 
  7.  INSERT( ProductID,ProductName,Price) 
  8.   VALUES(s.ProductID,s.ProductName,s.Price);

運行后2行受影響,我們已經(jīng)將Product表的數(shù)據(jù)同步到了ProductNew表。

現(xiàn)在,我們更新Product表4100037產(chǎn)品的價格,將其修改為55:

 
 
 
  1. UPDATE Product SET Price=55 WHERE ProductID='4100037';

我們也希望每天同步的時候應該將更新后的價格同步到ProductNew表,顯然此時在MERGE語句中應該添加WHEN MATCHED THEN 語句,該語句來更新ProductNew表的價格,添加匹配更新后的MERGE語句:

 
 
 
  1. MERGE ProductNew AS d 
  2. USING 
  3.     Product 
  4. AS s 
  5. ON s.ProductID = d.ProductId 
  6. WHEN NOT MATCHED THEN 
  7.     INSERT( ProductID,ProductName,Price) 
  8.         VALUES(s.ProductID,s.ProductName,s.Price) 
  9. WHEN MATCHED THEN 
  10.     UPDATE SET d.ProductName = s.ProductName, d.Price = s.Price;

執(zhí)行后2行受影響,為什么是兩行呢?因為我們的匹配條件只是按ProductID來關(guān)聯(lián)的,這樣匹配出來的記錄為2行。另外,我們的UPDATE語句里面沒有更新ProductID字段,因為這是完全沒必要的(如果修改了ProductID字段會直接走到NOT MATCHED)。

現(xiàn)在做個破壞,我們將410037產(chǎn)品刪除掉:

 
 
 
  1. DELETE Product WHERE ProductID='4100037';

明顯,上面給出的MERGE語句無法同步這種情況,再次回到MERGE語句的定義,對MERGE的WHEN NOT MATCHED THEN語句稍作擴展:

 
 
 
  1. WHEN NOT MATCHED BY TARGET 

表示目標表不匹配,BY TARGET是默認的,所以上面我們直接使用WHEN NOT MATCHED THEN

 
 
 
  1. WHEN NOT MATCHED BY SOURCE 

表示源表不匹配,即目標表中存在,源表中不存在的情況。

OK,現(xiàn)在我們要完成源表DELETE后,目標表的同步動作,MERGE語句如下:

 
 
 
  1. MERGE ProductNew AS d 
  2. USING 
  3.     Product 
  4. AS s 
  5. ON s.ProductID = d.ProductId 
  6. WHEN NOT MATCHED BY TARGET THEN 
  7.     INSERT( ProductID,ProductName,Price) 
  8.         VALUES(s.ProductID,s.ProductName,s.Price) 
  9. WHEN NOT MATCHED BY SOURCE THEN 
  10.     DELETE 
  11. WHEN MATCHED THEN 
  12. UPDATE SET d.ProductName = s.ProductName, d.Price = s.Price;

嗯,上面已經(jīng)使用到MERGE語句中的INSERT、UPDATE、DELETE語句,這足夠完成大多數(shù)的同步功能了。當然,MERGE語句還有很多的選項,在此不做詳述,請參考MSDN

鏈接:http://www.cnblogs.com/xfrog/archive/2010/10/13/1850602.html


網(wǎng)頁標題:詳解SQLServer2008中的MERGE語句
當前網(wǎng)址:http://www.5511xx.com/article/dphejoi.html