DML_8-Data Modification_MERGE (将Source表合并到Target)

语法:
MERGE INTO 目标表
USING 源表
WHEN MATCHED AND
                                 (Condition) THEN
        UPDATE SET
              目标表.Field1 = 源表.Field1,
           目标表.Field2 = 源表.Field2,
           ......
 
WHEN NOT MATCHED
        INSERT (Field1, Field2, ...)
        VALUES(VALUE1, VALUE2, ...)
WHEN NOT MATCHED BY SOURCE THEN        
--假使有此逻辑
        DELETE...    
;                                           --假使需要这么做 (Note:   semicolon不能遗漏)

/*
MERGE语句的用法
*/
-----------------------------------------------------------------------------------------
--表1.Customers
use testdb
IF OBJECT_ID('dbo.Customers','U') IS NOT NULL DROP TABLE dbo.Customers;
CREATE TABLE dbo.Customers
(
custid int NOT NULL,
companyname VARCHAR(25) NOT NULL,
phone VARCHAR(20) NOT NULL,
address VARCHAR(50) NOT NULL,
CONSTRAINT PK_Customers PRIMARY KEY(custid)
)
INSERT INTO dbo.Customers(custid,companyname,phone,address)
VALUES (1,'CUST_1','(111) 111-1111','address 1'),
(2,'CUST_2','(222) 222-2222','address 2'),
(3,'CUST_3','(333) 333-3333','address 3'),
(4,'CUST_4','(444) 444-4444','address 4'),
(5,'CUST_5','(555) 555-5555','address 5');
-----------------------------------------------------------------------------------------
--表2.CustomersStage
IF OBJECT_ID('dbo.CustomersStage','U') IS NOT NULL DROP TABLE dbo.CustomersStage;
CREATE TABLE dbo.CustomersStage
(
custid int NOT NULL,
companyname VARCHAR(25) NOT NULL,
phone VARCHAR(20) NOT NULL,
address VARCHAR(50) NOT NULL,
CONSTRAINT PK_CustomersStage PRIMARY KEY(custid)
)
INSERT INTO dbo.CustomersStage(custid,companyname,phone,address)
VALUES (2,'AAAAA','(222) 222-2222','address 2'),
(3,'CUST_3','(333) 333-3333','address 3'),
(5,'BBBBB','CCCCC','DDDDD'),
(6,'cust_6 (new)','(666) 666-6666','address 6'),
(7,'cust_7 (new)','(777) 777-7777','address 7');
-----------------------------------------------------------------------------------------
SELECT * FROM dbo.Customers
SELECT * FROM dbo.CustomersStage
-----------------------------------------------------------------------------------------
--3.Merge语句 without And condition
MERGE INTO dbo.Customers AS TGT
USING dbo.CustomersStage AS SRC
ON TGT.custid = SRC.custid
WHEN MATCHED THEN --此处没有其他条件,即使来源表与目标表完全相同,也要更新目标表
UPDATE SET
TGT.companyname = SRC.companyname,
TGT.phone = SRC.phone,
TGT.address = SRC.address
WHEN NOT MATCHED THEN
INSERT (custid, companyname, phone, address)
VALUES (SRC.custid,SRC.companyname, SRC.phone, SRC.address);
----------------
Note (此处试验是加了分号结束的,只是为了强调一下必须要以分号结束):
Msg 10713, Level 15, State 1, Line 53
A MERGE statement must be terminated by a semi-colon (;).
-----------------------------------------------------------------------------------------
----4.Merge语句 without And condition, WHEN NOT MATCHED BY SOURCE THEN
MERGE INTO dbo.Customers AS TGT
USING dbo.CustomersStage AS SRC
ON TGT.custid = SRC.custid
WHEN MATCHED THEN
UPDATE SET
TGT.companyname = SRC.companyname,
TGT.phone = SRC.phone,
TGT.address = SRC.address
WHEN NOT MATCHED THEN
INSERT (custid, companyname, phone, address)
VALUES (SRC.custid,SRC.companyname, SRC.phone, SRC.address)
WHEN NOT MATCHED BY SOURCE THEN
DELETE;
----------------
--在上一次已经合并的基础上,再次进行合并,所以此处显示5行被合并,2行被删除
(7 row(s) affected)
-----------------------------------------------------------------------------------------
--
--5.Merge语句 with And condition
MERGE INTO dbo.Customers AS TGT
USING dbo.CustomersStage AS SRC
ON TGT.custid = SRC.custid
WHEN MATCHED AND --
(TGT.companyname <> SRC.companyname
or TGT.phone <> SRC.phone
or TGT.address <> SRC.address) THEN
UPDATE SET
TGT.companyname = SRC.companyname,
TGT.phone = SRC.phone,
TGT.address = SRC.address
WHEN NOT MATCHED THEN
INSERT (custid, companyname, phone, address)
VALUES (SRC.custid,SRC.companyname, SRC.phone, SRC.address);
----------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------

建立的2个测试表查询的数据:
         
合并后的数据:
        

DML_Data Modification_MERGE的更多相关文章

  1. DML_Data Modification_UPDATE

    DML_Data Modification_UPDATE写不进去,不能专注了...... /* */ ------------------------------------------------- ...

  2. DML_Data Modification_DELETE

    DML_Data Modification_Delete删除记录比较简单,但是需要特别注意,一不小心,就变成了 “从删库到跑路“ 就掉的大了 /* Microsoft SQL Server 2008 ...

  3. DML_Data Modification_INSERT

    Data Modification (INSERT.DELETE.UPDATE.MERGE)之INSERT(基础知识,算是20年来第2次学习MSSQL吧,2005年折腾过一段时间的Oracle)INS ...

  4. DML_Modifying Data Through Table Expressions_UPDATE

    DML_Modifying Data Through Table Expressions_UPDATE之前也学习过使用CTE,再来泛泛的学习下,最后将会将一些书籍上或学习到的CTE来个小结 /* Mi ...

随机推荐

  1. mac+mamp安装composer

    打开终端 php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');"   安 ...

  2. wordpress评论回复邮件通知功能

    安装插件登录后台——点击“插件”——“安装插件”——按关键字搜索“Comment Reply Notification”——点击“现在安装”安装好后启用插件.如下图所示: 配置Comment Repl ...

  3. 【IOS】点击按钮-去高亮-加点击效果

    (1)前提:html页面 ,手机端, (2)问题一: 在iphone上(貌似是9以后..),给div/span/...等元素上加onclick事件,根本不起作用,这是为啥捏? -- 在元素上加  cu ...

  4. UIAutomator2的API文档(二)

    1.设备屏幕事件 熄灭屏幕d.screen_off() 唤醒屏幕d.screen_on() 屏蔽状态d.info.get('screenOn')#返回True or False 解锁屏幕d.unloc ...

  5. 网络编程杂谈之TCP协议

    TCP协议属于网络分层中的传输层,传输层作用的就是建立端口与端口的通信,而其下一层网络层的主要作用是建立"主机到主机"的通信,所以在我们日常进行网络编程时只要确定主机和端口,就能实 ...

  6. 逃离CSDN

    2012年2月18日,从CSDN搬家到这里.对于搬家的理由,总觉得该说点什么.我是在2012年1月29日又开始写博客的,在此之前我的CSDN博客闲置了10个月.从1月29日开始,不到1个月的时间建立了 ...

  7. 一个 static 还能难得住我?

    static 是我们日常生活中经常用到的关键字,也是 Java 中非常重要的一个关键字,static 可以修饰变量.方法.做静态代码块.静态导包等,下面我们就来具体聊一聊这个关键字,我们先从基础开始, ...

  8. day 7 while循环

    #隐式布尔值: 0 none 空# 一.流程控制# 短路运算:偷懒原则,偷懒到哪个位置,就把当前位置的值返回# 为0# (10>3 and 10 and 0 and 10 )or( 10> ...

  9. Rocket - 断句 - Diplomacy and TileLink from the Rocket Chip

    https://mp.weixin.qq.com/s/rfgptF9YxDpzDoespYtQvA   整理Diplomacy and TileLink from the Rocket Chip这篇文 ...

  10. js实现浏览器打印功能

    最近接触到一个新需求,实现打印机打印小票的功能.打的一桌子小票(惭愧),不过也基本满足了业务上的需求,现在分享一下如何实现(好记性不如烂笔头) 先上代码 // 布局代码 <div id=&quo ...