有两个表名:source 表和 target 表,并且要根据 source 表中匹配的值更新 target 表。

有三种情况:

  • source 表有一些 target 表不存在的行。在这种情况下,需要将 source 表中的行插入到 target 中。
  • target 表有一些 source表不存在的行。这种情况下,需要从 target 表中删除行。
  • source 表的某些行具有与 target 表中的行相同的键。但是,这些行在非键列中具有不同的值。这种情况下,需要使用来自 source 表中的值更新 target 表中的行。

下图,说明了 source 表和 target 表 的一些操作:插入,更新,删除:

如果单独使用 INSERT, UPDATE和DELETE语句,则需要三个单独的语句,来使 source 表中的匹配行的数据更新到 target表。

但是,使用 merge 可以同时执行三个操作。下面是 merge语句的语法:

MERGE target_table USING source_table
ON merge_condition
WHEN MATCHED
THEN update_statement
WHEN NOT MATCHED
THEN insert_statement
WHEN NOT MATCHED BY SOURCE
THEN DELETE;

使用示例:

CREATE TABLE sales.category (
category_id INT PRIMARY KEY,
category_name VARCHAR() NOT NULL,
amount DECIMAL( , )
); INSERT INTO sales.category(category_id, category_name, amount)
VALUES(,'Children Bicycles',),
(,'Comfort Bicycles',),
(,'Cruisers Bicycles',),
(,'Cyclocross Bicycles',); CREATE TABLE sales.category_staging (
category_id INT PRIMARY KEY,
category_name VARCHAR() NOT NULL,
amount DECIMAL( , )
); INSERT INTO sales.category_staging(category_id, category_name, amount)
VALUES(,'Children Bicycles',),
(,'Cruisers Bicycles',),
(,'Cyclocross Bicycles',),
(,'Electric Bikes',),
(,'Mountain Bikes',);

要使用 sales.category_staging(源表)中的值将数据更新到 sales.category(目标表),要使用 merge:

MERGE sales.category t
USING sales.category_staging s
ON (s.category_id = t.category_id)
WHEN MATCHED
THEN UPDATE SET
t.category_name = s.category_name,
t.amount = s.amount
WHEN NOT MATCHED BY TARGET
THEN INSERT (category_id, category_name, amount)
VALUES (s.category_id, s.category_name, s.amount)
WHEN NOT MATCHED BY SOURCE
THEN DELETE;

执行过程如下图:

SQL Server merge用法的更多相关文章

  1. SQL Server MERGE(合并)语句

    如何使用SQL Server MERGE语句基于与另一个表匹配的值来更新表中的数据.  SQL Server MERGE语句 假设有两个表,分别称为源表和目标表,并且需要根据与源表匹配的值来更新目标表 ...

  2. SQL Server Merge语句的使用

    Merge关键字在SQL Server 2008被引入,它能将Insert,Update,Delete简单的并为一句.MSDN对于Merge的解释非常的短小精悍:”根据与源表联接的结果,对目标表执行插 ...

  3. SQL Server特殊用法笔记

    1. MERGE用法:关联两表,有则改,无则加 SQL语句: create table #AAA(id int,A int,AA int,AAA int,B int) create table #BB ...

  4. SQL Server MERGE

    Merge关键字是一个神奇的DML关键字.它在SQL Server 2008被引入,它能将Insert,Update,Delete简单的并为一句.MSDN对于Merge的解释非常的短小精悍:”根据与源 ...

  5. SQL SERVER各种用法总结

    sql创建临时表http://www.cnblogs.com/jeffwongishandsome/archive/2009/08/05/1526466.html sqlserver更改表名 EXEC ...

  6. sql server merge 的用法

    CREATE TABLE tTable ( id INT , f1 VARCHAR(10) , f2 VARCHAR(10) , f3 VARCHAR(10) ) GO INSERT INTO tTa ...

  7. sql server merge into 与update 批量更新1 百万测试数据的性能比较

    1. 1百万的测试数据的生成 declare @index int;  begin  set @index=0;  while @index<1000000  begin  insert int ...

  8. SQL Server存储过程用法介绍

    存储过程其实就是已预编译为可执行过程的一个或多个SQL语句. 通过调用和传递参数即可完成该存储过程的功能. 前面有介绍过存储过程的一些语法,但是没有详细示例,今天我们来一起研究一下存储过程. 提高性能 ...

  9. SQL Server @@ERROR 用法

    @@error是系统函数,当没有发生错误时返回0,如果发生错误时@@error<>0,并返回错误号,每个SQL语句执行完,@@error值都会变. @@error只记录当前错误,如果存储过 ...

随机推荐

  1. EM算法直观认识

    Expectation Maximization, 字面翻译为, "最大期望". 我个人其实一直都不太理解EM算法, 从我个人的渊源来看, 之前数理统计里面的参数估计, 也是没有太 ...

  2. day06 作业

    猜年龄游戏 ''' 1. 给定年龄,用户可以猜三次年龄 2. 年龄猜对,让用户选择两次奖励 3. 用户选择两次奖励后可以退出 ''' import random age = random.randin ...

  3. 全球唯一标识符 System.Guid.NewGuid().ToString()

    System.Guid.NewGuid().ToString(); //ToString() 为 null 或空字符串 (""),则使用"D". 结果:8209 ...

  4. kolla-ansible部署openstack allinone单节点

    环境准备 2 network interfaces 8GB main memory 40GB disk space 1.修改hostname hostnamectl set-hostname koll ...

  5. python安装thrift-sasl提示缺少sasl.h文件

    这其实是在pip安装Cyrus-SASL bindings for Python时报的错误. 由于没有whl文件,都是源码要经过编译之后才能安装. 所以,报这个错误,一般都是缺少安装软件造成的. 不管 ...

  6. echarts之--柱状图-%显示

    测试地址 https://www.echartsjs.com/examples/zh/editor.html?c=bar-tick-align var option = { title: { text ...

  7. conan使用(五)--打包chromium-base

    现在我们就利用之前学习到的conan的使用方法,将chromium中的base库打包成一个conan包. 1. 准备源码 chromium本身是通过gn来编译的,这个目前conan并不支持.所以需要把 ...

  8. c# 第15节 StringBuilder

    本节内容: 1:StringBuilder 2:内容总结 1:StringBuilder 实例: 2:内容总结 项目:

  9. 搭建pikachu平台及暴力破解

    一.先将Pikachu文件放在网站根目录下 二.修改pikachu网站的配置文件  inc/config.inc.php define('DBUSER', 'user'); define('DBPW' ...

  10. thymeleaf实现热部署

    热部署可以在修改页面之后,不重新启动服务器也能查看修改效果. 1.导入依赖,我用的是gradle,使用maven的可以去https://mvnrepository.com/寻找对应的依赖 compil ...