SQL Server 2008中的MERGE(不僅僅是合并)
來源:易賢網(wǎng) 閱讀:914 次 日期:2014-08-25 10:22:31
溫馨提示:易賢網(wǎng)小編為您整理了“SQL Server 2008中的MERGE(不僅僅是合并)”,方便廣大網(wǎng)友查閱!

[導(dǎo)讀]就像標題呈現(xiàn)的一樣,SQL Server 2008中的MERGE語句能做很多事情,它的功能是根據(jù)源表對目標表執(zhí)行插入、更新或刪除操作。最典型的應(yīng)用就是進行兩個表的同步。

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

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

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

--源表

CREATE TABLE Product

( ProductID varchar(7) NOT NULL PRIMARY KEY, ProductName varchar(100) NOT NULL, Price decimal(13,2) DEFAULT 0

);

INSERT INTO Product Values ('4100037','優(yōu)盤',50), ('4100038','鼠標',30);

--目標表

CREATE TABLE ProductNew

( ProductID varchar(7) NOT NULL PRIMARY KEY, ProductName varchar(100) NOT NULL, Price decimal(13,2) DEFAULT 0

);

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

MERGE 目標表

USING 源表

ON 匹配條件

WHEN MATCHED THEN

語句

WHEN NOT MATCHED THEN

語句;

以上是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語句如下:

MERGE ProductNew AS d

USING Product

AS s

ON s.ProductID = d.ProductId WHEN NOT MATCHED THEN INSERT( ProductID,ProductName,Price) VALUES(s.ProductID,s.ProductName,s.Price);

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

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

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

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

MERGE ProductNew AS d

USING Product

AS s

ON s.ProductID = d.ProductId

WHEN NOT MATCHED THEN INSERT( ProductID,ProductName,Price) VALUES(s.ProductID,s.ProductName,s.Price)

WHEN MATCHED THEN 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)品刪除掉:

DELETE Product WHERE ProductID='4100037';

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

WHEN NOT MATCHED BY TARGET

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

WHEN NOT MATCHED BY SOURCE

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

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

MERGE ProductNew AS d

USING Product

AS s

ON s.ProductID = d.ProductId

WHEN NOT MATCHED BY TARGET THEN INSERT( ProductID,ProductName,Price) VALUES(s.ProductID,s.ProductName,s.Price)

WHEN NOT MATCHED BY SOURCE THEN DELETE

WHEN MATCHED THEN UPDATE SET d.ProductName = s.ProductName, d.Price = s.Price;

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

更多信息請查看IT技術(shù)專欄

更多信息請查看數(shù)據(jù)庫
易賢網(wǎng)手機網(wǎng)站地址:SQL Server 2008中的MERGE(不僅僅是合并)
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇剩?/div>

2025國考·省考課程試聽報名

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 加入群交流 | 手機站點 | 投訴建議
工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網(wǎng)安備53010202001879號 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號:hfpxwx
咨詢QQ:526150442(9:00—18:00)版權(quán)所有:易賢網(wǎng)