DML_Data Modification_MERGE
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的更多相关文章
- DML_Data Modification_UPDATE
DML_Data Modification_UPDATE写不进去,不能专注了...... /* */ ------------------------------------------------- ...
- DML_Data Modification_DELETE
DML_Data Modification_Delete删除记录比较简单,但是需要特别注意,一不小心,就变成了 “从删库到跑路“ 就掉的大了 /* Microsoft SQL Server 2008 ...
- DML_Data Modification_INSERT
Data Modification (INSERT.DELETE.UPDATE.MERGE)之INSERT(基础知识,算是20年来第2次学习MSSQL吧,2005年折腾过一段时间的Oracle)INS ...
- DML_Modifying Data Through Table Expressions_UPDATE
DML_Modifying Data Through Table Expressions_UPDATE之前也学习过使用CTE,再来泛泛的学习下,最后将会将一些书籍上或学习到的CTE来个小结 /* Mi ...
随机推荐
- Hyperledger fabric MSP成员管理
Hyperledger fabric 1.0 基于 PKI(Public Key Infrastructure)体系,引入了MSP模块(Membership Service Provider): 成员 ...
- .Net基础之1——学前入门
1..Net平台 2.C#编程语言 3..Net都能做什么 Winform桌面应用程序.Internet应用程序——ASP.Net(京东.淘宝.携程网)(主推). WP8手机开发.Unity 3D游戏 ...
- 【python爬虫】scrapy实战1--百万微博任性采集
原文: https://blog.csdn.net/qq_36936730/article/details/105132550
- thymeleaf将对象ModelList数据抛到HTML页面
- json数据写入hbase
package main.scala.com.web.zhangyong168.cn.spark.java; import org.apache.hadoop.hbase.HBaseConfigura ...
- 一个基类Person的多个派生类 代码参考
#include <iostream> #include <cstring> using namespace std; class Person { protected: ch ...
- [apue] 一个工业级、跨平台的 tcp 网络服务框架:gevent
作为公司的公共产品,经常有这样的需求:就是新建一个本地服务,产品线作为客户端通过 tcp 接入本地服务,来获取想要的业务能力. 与印象中动辄处理成千上万连接的 tcp 网络服务不同,这个本地服务是跑在 ...
- Alpha冲刺 —— 5.3
这个作业属于哪个课程 软件工程 这个作业要求在哪里 团队作业第五次--Alpha冲刺 这个作业的目标 Alpha冲刺 作业正文 正文 github链接 项目地址 其他参考文献 无 一.会议内容 1.展 ...
- 超干货!为了让你彻底弄懂MySQL事务日志,我通宵肝出了这份图解!
还记得刚上研究生的时候,导师常挂在嘴边的一句话,"科研的基础不过就是数据而已."如今看来,无论是人文社科,还是自然科学,或许都可在一定程度上看作是数据的科学. 倘若剥开研究领域的外 ...
- Java 从入门到精通-反射机制
导读 Java反射机制是开发者迈向结构化开发的重要一步,同时掌握了反射机制也就掌握了所有框架的核心实现思想. 认识反射机制 简单例子 通过以上的程序就会发现,除了对象的正向处理操作之外,还可以通过ge ...