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不能遗漏)

  1. /*
  2. MERGE语句的用法
  3. */
  4. -----------------------------------------------------------------------------------------
  5. --表1.Customers
  6. use testdb
  7. IF OBJECT_ID('dbo.Customers','U') IS NOT NULL DROP TABLE dbo.Customers;
  8. CREATE TABLE dbo.Customers
  9. (
  10. custid int NOT NULL,
  11. companyname VARCHAR(25) NOT NULL,
  12. phone VARCHAR(20) NOT NULL,
  13. address VARCHAR(50) NOT NULL,
  14. CONSTRAINT PK_Customers PRIMARY KEY(custid)
  15. )
  16. INSERT INTO dbo.Customers(custid,companyname,phone,address)
  17. VALUES (1,'CUST_1','(111) 111-1111','address 1'),
  18. (2,'CUST_2','(222) 222-2222','address 2'),
  19. (3,'CUST_3','(333) 333-3333','address 3'),
  20. (4,'CUST_4','(444) 444-4444','address 4'),
  21. (5,'CUST_5','(555) 555-5555','address 5');
  22. -----------------------------------------------------------------------------------------
  23. --表2.CustomersStage
  24. IF OBJECT_ID('dbo.CustomersStage','U') IS NOT NULL DROP TABLE dbo.CustomersStage;
  25. CREATE TABLE dbo.CustomersStage
  26. (
  27. custid int NOT NULL,
  28. companyname VARCHAR(25) NOT NULL,
  29. phone VARCHAR(20) NOT NULL,
  30. address VARCHAR(50) NOT NULL,
  31. CONSTRAINT PK_CustomersStage PRIMARY KEY(custid)
  32. )
  33. INSERT INTO dbo.CustomersStage(custid,companyname,phone,address)
  34. VALUES (2,'AAAAA','(222) 222-2222','address 2'),
  35. (3,'CUST_3','(333) 333-3333','address 3'),
  36. (5,'BBBBB','CCCCC','DDDDD'),
  37. (6,'cust_6 (new)','(666) 666-6666','address 6'),
  38. (7,'cust_7 (new)','(777) 777-7777','address 7');
  39. -----------------------------------------------------------------------------------------
  40. SELECT * FROM dbo.Customers
  41. SELECT * FROM dbo.CustomersStage
  42. -----------------------------------------------------------------------------------------
  43. --3.Merge语句 without And condition
  44. MERGE INTO dbo.Customers AS TGT
  45. USING dbo.CustomersStage AS SRC
  46. ON TGT.custid = SRC.custid
  47. WHEN MATCHED THEN --此处没有其他条件,即使来源表与目标表完全相同,也要更新目标表
  48. UPDATE SET
  49. TGT.companyname = SRC.companyname,
  50. TGT.phone = SRC.phone,
  51. TGT.address = SRC.address
  52. WHEN NOT MATCHED THEN
  53. INSERT (custid, companyname, phone, address)
  54. VALUES (SRC.custid,SRC.companyname, SRC.phone, SRC.address);
  55. ----------------
  56. Note (此处试验是加了分号结束的,只是为了强调一下必须要以分号结束):
  57. Msg 10713, Level 15, State 1, Line 53
  58. A MERGE statement must be terminated by a semi-colon (;).
  59. -----------------------------------------------------------------------------------------
  60. ----4.Merge语句 without And condition, WHEN NOT MATCHED BY SOURCE THEN
  61. MERGE INTO dbo.Customers AS TGT
  62. USING dbo.CustomersStage AS SRC
  63. ON TGT.custid = SRC.custid
  64. WHEN MATCHED THEN
  65. UPDATE SET
  66. TGT.companyname = SRC.companyname,
  67. TGT.phone = SRC.phone,
  68. TGT.address = SRC.address
  69. WHEN NOT MATCHED THEN
  70. INSERT (custid, companyname, phone, address)
  71. VALUES (SRC.custid,SRC.companyname, SRC.phone, SRC.address)
  72. WHEN NOT MATCHED BY SOURCE THEN
  73. DELETE;
  74. ----------------
  75. --在上一次已经合并的基础上,再次进行合并,所以此处显示5行被合并,2行被删除
  76. (7 row(s) affected)
  77. -----------------------------------------------------------------------------------------
  78. --
  79. --5.Merge语句 with And condition
  80. MERGE INTO dbo.Customers AS TGT
  81. USING dbo.CustomersStage AS SRC
  82. ON TGT.custid = SRC.custid
  83. WHEN MATCHED AND --
  84. (TGT.companyname <> SRC.companyname
  85. or TGT.phone <> SRC.phone
  86. or TGT.address <> SRC.address) THEN
  87. UPDATE SET
  88. TGT.companyname = SRC.companyname,
  89. TGT.phone = SRC.phone,
  90. TGT.address = SRC.address
  91. WHEN NOT MATCHED THEN
  92. INSERT (custid, companyname, phone, address)
  93. VALUES (SRC.custid,SRC.companyname, SRC.phone, SRC.address);
  94. -----------------------------------------------------------------------------------------
  95.  
  96. -----------------------------------------------------------------------------------------
  97.  
  98. -----------------------------------------------------------------------------------------

建立的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打不开inkscape怎么办

    本经验题目提到的是一款矢量图片编辑软件,对于打开不开的软件,完全可以通过卸载软件后进行安装.这里就从安装以及卸载的过程说明一下这个软件的安装卸载过程. 方法/步骤 打开电脑任意一个浏览器图标,进入浏览 ...

  2. C# HttpClient 使用 Consul 发现服务

    试用了Overt.Core.Grpc, 把 GRPC 的使用改造得像 WCF, 性能测试也非常不错, 非常推荐各位使用. 但已有项目大多是 http 请求, 改造成 GRPC 的话, 工作量比较大, ...

  3. C#日志记录类

    public class WriteLog { /// <summary> /// 将错误写入文件中 /// </summary> /// <param name=&qu ...

  4. Mycat-多实例的搭建

    1. 基础环境准备1.1 环境准备:两台虚拟机 db01 db02每台创建四个mysql实例:3307 3308 3309 33101.2 删除历史环境:pkill mysqldrm -rf /dat ...

  5. CF652E Pursuit For Aritifacts

    题目传送门 这是一道很好的练习强联通的题目. 首先,从题中可以看到,题目的要求就是要我们求出从起点到终点是否可以经过flag = 1 的边. 由于是无向图,且要求很多,直接暴力dfs会很凌乱. 那么, ...

  6. Rocket - regmapper - RegField

    https://mp.weixin.qq.com/s/7WKB1QxcVzqm2Q7bWcKHzA 简单介绍RegField的实现. 1. 简单介绍 定义寄存器域相关的参数类型. 2. RegFiel ...

  7. Rocket - util - Timer

    https://mp.weixin.qq.com/s/Z4JJhZ_jL1lqF1nf_orq9A   简单介绍Timer的实现.   ​​   1. 基本功能   实现定时器的功能.   2. Ti ...

  8. 带你学够浪:Go语言基础系列-环境配置和 Hello world

    文章每周持续更新,原创不易,「三连」让更多人看到是对我最大的肯定.可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一般比博客早更新一到两篇) 前面几周陆陆续续写了一些后端技术的文章,包括数据库.微 ...

  9. Spring ( 三 ) Spring的Bean的装配与生命周期、专用测试

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.对象的生命周期 1.IOC之Bean的生命周期 创建带有生命周期方法的bean public cla ...

  10. Java实现 蓝桥杯 基础练习 闰年判断

    基础练习 闰年判断 时间限制:1.0s 内存限制:256.0MB 提交此题 锦囊1 锦囊2 问题描述 给定一个年份,判断这一年是不是闰年. 当以下情况之一满足时,这一年是闰年: 年份是4的倍数而不是1 ...