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 ...
随机推荐
- Mac打不开inkscape怎么办
本经验题目提到的是一款矢量图片编辑软件,对于打开不开的软件,完全可以通过卸载软件后进行安装.这里就从安装以及卸载的过程说明一下这个软件的安装卸载过程. 方法/步骤 打开电脑任意一个浏览器图标,进入浏览 ...
- C# HttpClient 使用 Consul 发现服务
试用了Overt.Core.Grpc, 把 GRPC 的使用改造得像 WCF, 性能测试也非常不错, 非常推荐各位使用. 但已有项目大多是 http 请求, 改造成 GRPC 的话, 工作量比较大, ...
- C#日志记录类
public class WriteLog { /// <summary> /// 将错误写入文件中 /// </summary> /// <param name=&qu ...
- Mycat-多实例的搭建
1. 基础环境准备1.1 环境准备:两台虚拟机 db01 db02每台创建四个mysql实例:3307 3308 3309 33101.2 删除历史环境:pkill mysqldrm -rf /dat ...
- CF652E Pursuit For Aritifacts
题目传送门 这是一道很好的练习强联通的题目. 首先,从题中可以看到,题目的要求就是要我们求出从起点到终点是否可以经过flag = 1 的边. 由于是无向图,且要求很多,直接暴力dfs会很凌乱. 那么, ...
- Rocket - regmapper - RegField
https://mp.weixin.qq.com/s/7WKB1QxcVzqm2Q7bWcKHzA 简单介绍RegField的实现. 1. 简单介绍 定义寄存器域相关的参数类型. 2. RegFiel ...
- Rocket - util - Timer
https://mp.weixin.qq.com/s/Z4JJhZ_jL1lqF1nf_orq9A 简单介绍Timer的实现. 1. 基本功能 实现定时器的功能. 2. Ti ...
- 带你学够浪:Go语言基础系列-环境配置和 Hello world
文章每周持续更新,原创不易,「三连」让更多人看到是对我最大的肯定.可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一般比博客早更新一到两篇) 前面几周陆陆续续写了一些后端技术的文章,包括数据库.微 ...
- Spring ( 三 ) Spring的Bean的装配与生命周期、专用测试
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.对象的生命周期 1.IOC之Bean的生命周期 创建带有生命周期方法的bean public cla ...
- Java实现 蓝桥杯 基础练习 闰年判断
基础练习 闰年判断 时间限制:1.0s 内存限制:256.0MB 提交此题 锦囊1 锦囊2 问题描述 给定一个年份,判断这一年是不是闰年. 当以下情况之一满足时,这一年是闰年: 年份是4的倍数而不是1 ...