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个测试表查询的数据:
         
合并后的数据:
        

最新文章

  1. nginx 配置https
  2. 第三章 文件IO复习
  3. 全面理解面向对象的 JavaScript (share)
  4. 自定的 HttpModule 为什么总是执行两次
  5. centos6.5 openvpn安装配置
  6. loading加载中效果
  7. Match类解析
  8. Discuz的安装与使用
  9. RabbitMQ基础入门
  10. 模板引擎artTemplate的使用
  11. Vue笔记(props和 mounted)
  12. (后端)出现org.hibernate.NonUniqueResultException的原因即解决办法
  13. python高级数据可视化Dash2
  14. python 小程序,输错三次密码锁定账户
  15. cocos2d-x游戏引擎核心(3.x)----事件分发机制之事件从(android,ios,desktop)系统传到cocos2dx的过程浅析
  16. 执行这些代码, Edit1只能输入数字,小数点和负号,负号和小数点只能输入一个,负号必须在最前,粘贴的数字必须完全正确.
  17. Dubbo -- 系统学习 笔记 -- 入门
  18. git 上传文件到仓库上提示:origin does not to be a git repository
  19. 转载:http://www.cnblogs.com/double-K/p/6926367.html
  20. 自己对git的认识。

热门文章

  1. 【1-n】区间覆盖 TOJ4168+BZOJ1192
  2. Java方法的定义以及调用、方法重载、可变参数以及递归
  3. mysql新
  4. 【转发】基本adbui命令使用 可做图像识别
  5. 集合框架之ArrayList -Java
  6. 一文带你学会基于SpringAop实现操作日志的记录
  7. Android系统签名简介
  8. 【转】DataFrame合并
  9. 关于同一密码使用generate_password_hash生成不同的密码散列值
  10. win10下安装scrapy出现错误的处理