午夜国产狂喷潮在线观看|国产AⅤ精品一区二区久久|中文字幕AV中文字幕|国产看片高清在线

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

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

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

    下面通過(guò)一個(gè)簡(jiǎn)單示例來(lái)演示MERGE語(yǔ)句的使用方法,假設(shè)數(shù)據(jù)庫(kù)中有兩個(gè)表Product及ProductNew,我們的任務(wù)是將Product的數(shù)據(jù)同步到ProductNew(當(dāng)然同步可能是每天通過(guò)Job來(lái)自動(dòng)完成的,在此我們只關(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)盤(pán)',50), ('4100038','鼠標(biāo)',30);

    --目標(biāo)表

    CREATE TABLE ProductNew

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

    );

    下面再來(lái)關(guān)注MERGE語(yǔ)句的基本語(yǔ)法:

    MERGE 目標(biāo)表

    USING 源表

    ON 匹配條件

    WHEN MATCHED THEN

    語(yǔ)句

    WHEN NOT MATCHED THEN

    語(yǔ)句;

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

    格外強(qiáng)調(diào)一點(diǎn),MERGE語(yǔ)句最后的分號(hào)是不能省略的!

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

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

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

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

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

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

    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行受影響,為什么是兩行呢?因?yàn)槲覀兊钠ヅ錀l件只是按ProductID來(lái)關(guān)聯(lián)的,這樣匹配出來(lái)的記錄為2行。另外,我們的UPDATE語(yǔ)句里面沒(méi)有更新ProductID字段,因?yàn)檫@是完全沒(méi)必要的(如果修改了ProductID字段會(huì)直接走到NOT MATCHED)。

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

    DELETE Product WHERE ProductID='4100037';

    明顯,上面給出的MERGE語(yǔ)句無(wú)法同步這種情況,再次回到MERGE語(yǔ)句的定義,對(duì)MERGE的WHEN NOT MATCHED THEN語(yǔ)句稍作擴(kuò)展:

    WHEN NOT MATCHED BY TARGET

    表示目標(biāo)表不匹配,BY TARGET是默認(rèn)的,所以上面我們直接使用WHEN NOT MATCHED THEN

    WHEN NOT MATCHED BY SOURCE

    表示源表不匹配,即目標(biāo)表中存在,源表中不存在的情況。

    現(xiàn)在我們要完成源表DELETE后,目標(biāo)表的同步動(dòng)作,MERGE語(yǔ)句如下:

    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語(yǔ)句中的INSERT、UPDATE、DELETE語(yǔ)句,這足夠完成大多數(shù)的同步功能了。當(dāng)然,MERGE語(yǔ)句還有很多的選項(xiàng),在此不做詳述,請(qǐng)參考MSDN.

    更多信息請(qǐng)查看IT技術(shù)專(zhuān)欄

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

    2025國(guó)考·省考課程試聽(tīng)報(bào)名

    • 報(bào)班類(lèi)型
    • 姓名
    • 手機(jī)號(hào)
    • 驗(yàn)證碼
    關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡(jiǎn)要咨詢(xún) | 簡(jiǎn)要咨詢(xún)須知 | 新媒體/短視頻平臺(tái) | 手機(jī)站點(diǎn) | 投訴建議
    工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
    云南網(wǎng)警備案專(zhuān)用圖標(biāo)
    聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢(xún)關(guān)注公眾號(hào):hfpxwx
    咨詢(xún)QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
    云南網(wǎng)警報(bào)警專(zhuān)用圖標(biāo)