博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用MERGE语句同步表
阅读量:4629 次
发布时间:2019-06-09

本文共 5599 字,大约阅读时间需要 18 分钟。

先建好測试环境: USE TEMPDBGOIF OBJECT_ID('T1') IS NOT NULL DROP TABLE T1IF OBJECT_ID('T2') IS NOT NULL DROP TABLE T2GOCREATE TABLE T1(ID1 INT,VAL1 VARCHAR(50))CREATE TABLE T2(ID2 INT,VAL2 VARCHAR(50))GOINSERT INTO T1SELECT 1,'A' UNION ALLSELECT 2,'B' UNION ALLSELECT 3,'C' 如今我们的目标是让T2表与T1表同步,我直接把完整的MERGE语句帖上来,等下再细说各个部分:
MERGE INTO T2 AS TB_TARGETUSING T1 AS TB_SOURCEON TB_TARGET.ID2=TB_SOURCE.ID1WHEN NOT MATCHED BY TARGET THEN INSERT(ID2,VAL2)VALUES(ID1,VAL1)WHEN NOT MATCHED BY SOURCE THENDELETEWHEN MATCHED AND TB_TARGET.VAL2<>TB_SOURCE.VAL1 THEN UPDATE SETTB_TARGET.VAL2=TB_SOURCE.VAL1OUTPUT $ACTION,ISNULL(DELETED.ID2,INSERTED.ID2) AS ID,DELETED.VAL2,INSERTED.VAL2;看看MERGE语句输出的结果/*$ACTION    ID2         VAL2                                               VAL2---------- ----------- -------------------------------------------------- --------------------------------------------------INSERT     1           NULL                                               AINSERT     2           NULL                                               BINSERT     3           NULL                                               C*/再看一下如今T2的内容: SELECT * FROM T2/*ID2         VAL2----------- --------------------------------------------------1           A2           B3           C*/ 能够看到T1的东东已经过去了,也就是说初步的同步完毕了。如今做一些其他的操作,我们分别插入、更新、删除一条数据:UPDATE T1 SET VAL1='D' WHERE ID1=3DELETE FROM T1 WHERE ID1=2INSERT INTO T1SELECT 4,'E'SELECT * FROM T1 /*ID1         VAL1----------- --------------------------------------------------1           A4           E3           D*/如今各种数据都有了,1没变,2删了,3改了,4是加的。再执行上面那坨MERGE语句:MERGE INTO T2 AS TB_TARGETUSING T1 AS TB_SOURCEON TB_TARGET.ID2=TB_SOURCE.ID1WHEN NOT MATCHED BY TARGET THEN INSERT(ID2,VAL2)VALUES(ID1,VAL1)WHEN NOT MATCHED BY SOURCE THENDELETEWHEN MATCHED AND TB_TARGET.VAL2<>TB_SOURCE.VAL1 THEN UPDATE SETTB_TARGET.VAL2=TB_SOURCE.VAL1OUTPUT $ACTION,ISNULL(DELETED.ID2,INSERTED.ID2) AS ID,DELETED.VAL2,INSERTED.VAL2;/*$ACTION    ID          VAL2                                               VAL2---------- ----------- -------------------------------------------------- --------------------------------------------------INSERT     4           NULL                                               EDELETE     2           B                                                  NULLUPDATE     3           C                                                  D*/ 看一下T2的数据SELECT * FROM T2/*ID2         VAL2----------- --------------------------------------------------1           A3           D4           E*/能够看到,数据已经全然同步了。看到效果后,我们就能够開始说正文了,我再粘一次MERGE语句,然后一句一句细说MERGE INTO T2 AS TB_TARGETUSING T1 AS TB_SOURCEON TB_TARGET.ID2=TB_SOURCE.ID1WHEN NOT MATCHED BY TARGET THEN INSERT(ID2,VAL2)VALUES(ID1,VAL1)WHEN NOT MATCHED BY SOURCE THENDELETEWHEN MATCHED AND TB_TARGET.VAL2<>TB_SOURCE.VAL1 THEN UPDATE SETTB_TARGET.VAL2=TB_SOURCE.VAL1OUTPUT $ACTION,ISNULL(DELETED.ID2,INSERTED.ID2) AS ID,DELETED.VAL2,INSERTED.VAL2; 1.MERGE INTO T2 AS TB_TARGET指定要同步的目标表。MERGE是keyword,INTO可有可无,T2是目标表名,AS可有可无,TB_TARGET是表别名。假设要对目标表加表提示和索引提示,比方WITH(...),加在T2和AS中间就能够了。2.USING T1 AS TB_SOURCE指定用来作为同步源的表或其他东东。USING是keyword,T1是原表名或一个子查询,比方一堆JOIN出来的东西用括号括起来。AS同上,TB_SOURCE是别名。3.ON TB_TARGET.ID2=TB_SOURCE.ID1关联条件,没什么好说的,注意这里開始就用到上面定义的别名了。4.WHEN NOT MATCHED BY TARGET THENINSERT(ID2,VAL2)VALUES(ID1,VAL1)这里放到一起说。看到INSERT应该就能猜这段语句的意思是“假设原表有的记录新表没有,就插入”。NOT MATCHED表示不匹配, BY TARGET表示是新表找不到匹配原表条件(就是上面的ON后写的)的记录, BY TARGET 能够不写,默认就是BY TARGET,但假设要写两个WHEN MATCHED就必需要写,比方上面这个MERGE。第二三行和普通的插入语句差点儿相同,差别就在于没有目标表名和仅仅能用VALUES不能用SELECT,由于这里都是针对单行的操作。5.WHEN NOT MATCHED BY SOURCE THENDELETE这个就简单了,假设是原表找不到新表的匹配记录,就把新表的删了。需要注意的就是假设要加上这句,上面的NOT MATCHED必须加BY TARGET。6.WHEN MATCHED AND TB_TARGET.VAL2<>TB_SOURCE.VAL1 THEN UPDATE SETTB_TARGET.VAL2=TB_SOURCE.VAL1第一行后面的AND部分能够不要,相当于更新的另一个匹配条件,像上面样例中,ID为1的那条数据没有动,但由于能找到匹配记录还是会更新,加上条件就能够避免这样的无效操作了。7.OUTPUT $ACTION,ISNULL(DELETED.ID2,INSERTED.ID2) AS ID,DELETED.VAL2,INSERTED.VAL2这行能够都去掉,作用就是输出同步的数据,用过触发器的同学对INSERTED和DELETED两个表应该灰常熟悉,分别放的是更新后的值和更新前的值,看看最后一次MERGE输出的信息就能差点儿相同看出门道了,我就不多说了。假设要调试语句的话,能够加上这句,正常的同步就能够去掉了。8.;这个必须有。。。。。 总之,4,5,6,7都是能够去掉的,但4,5,6至少要有一个,这就是MERGE的所有经常使用语法了。另一个最后能够加 OPTION查询提示  最后简单对照一下MERGE和原本相同效果的操作的IO对照MERGE INTO T2 AS TB_TARGETUSING T1 AS TB_SOURCEON TB_TARGET.ID2=TB_SOURCE.ID1WHEN NOT MATCHED BY TARGET THEN INSERT(ID2,VAL2)VALUES(ID1,VAL1)WHEN NOT MATCHED BY SOURCE THENDELETEWHEN MATCHED AND TB_TARGET.VAL2<>TB_SOURCE.VAL1 THEN UPDATE SETTB_TARGET.VAL2=TB_SOURCE.VAL1OUTPUT $ACTION,ISNULL(DELETED.ID2,INSERTED.ID2) AS ID,DELETED.VAL2,INSERTED.VAL2; /*表 'T2'。扫描计数 2,逻辑读取 7 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。表 'T1'。扫描计数 2,逻辑读取 4 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。*/ PRINT '------------------------------------------------------------------------------------'INSERT INTO T2(ID2,VAL2)SELECT ID1,VAL1FROM T1 WHERE NOT EXISTS(SELECT 1 FROM T2 WHERE T2.ID2=T1.ID1)UPDATE T2SET T2.VAL2=T1.VAL1FROM T2INNER JOIN T1 ON T2.ID2=T1.ID1AND T2.VAL2<>T1.VAL1DELETE FROM T2 WHERE NOT EXISTS(SELECT 1 FROM T1 WHERE T1.ID1=T2.ID2) /*表 'T2'。扫描计数 1,逻辑读取 4 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。表 'Worktable'。扫描计数 1,逻辑读取 5 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。表 'T1'。扫描计数 1,逻辑读取 1 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。表 'T2'。扫描计数 1,逻辑读取 2 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。表 'T1'。扫描计数 1,逻辑读取 4 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。表 'T2'。扫描计数 1,逻辑读取 1 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。表 'T1'。扫描计数 1,逻辑读取 4 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。*/

转载于:https://www.cnblogs.com/gcczhongduan/p/4195485.html

你可能感兴趣的文章
安装centos后无法引导启动windows7的解决方法
查看>>
AutoMapper用法
查看>>
Asterisk安装
查看>>
鄙视题
查看>>
如何在Vue项目中使用vw实现移动端适配(转)
查看>>
Apache Tomcat 7.x 概述
查看>>
as3绕过策略文件给视频截图
查看>>
leetcode网学习笔记(1)
查看>>
自制操作系统Antz(9)——实现内核 (下) 实现图形化界面
查看>>
JavaScript获取当前日期,昨天,今天日期以及任意天数间隔日期
查看>>
电子宠物系统
查看>>
windows远程桌面如果超出最大连接数, 使用命令行mstsc /console登录即可
查看>>
49. Group Anagrams
查看>>
SPOJ ATOMS - Atoms in the Lab
查看>>
关于 ListBox 自动换行
查看>>
postman测试上传文件
查看>>
R. ftp软件
查看>>
List<T>中,Remove和RemoveAt区别
查看>>
十月回家记
查看>>
ZOJ 3735 dp
查看>>