有两个表名: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. Django ajax 检测用户名是否已被注册

    添加一个 register.html 页面 <!DOCTYPE html> <html lang="en"> <head> <meta c ...

  2. 【Spring Boot】Spring Boot之使用ImportBeanDefinitionRegistrar类实现动态注册Bean

    一.ImportBeanDefinitionRegistrar类介绍 ImportBeanDefinitionRegistrar类通过其他@Configuration类通过@Import的方式来加载, ...

  3. Ubuntu14 安装过程

    系统:Description:    Ubuntu 14.04.6 LTS平台:Oracle VM VirtualBox 先到阿里巴巴开源镜像站 https://opsx.alibaba.com/ 下 ...

  4. Linux---基本目录与文件命令

    一.目录 1.显示工作目录命令pwd 2.改变工作目录命令cd 3.创建目录命令mkdir 二.文件 1.创建空文件命令touch 2.显示文件列表ls 3.复制文件或目录命令cp 4.删除文件或目录 ...

  5. WAF的部署方式——有直路部署和旁路部署

    随着电子商务.网上银行.电子政务的盛行,WEB服务器承载的业务价值越来越高,WEB服务器所面临的安全威胁也随之增大,因此,针对WEB应用层的防御成为必然趋势,WAF(WebApplicationFir ...

  6. HBuilder创建app 3

    一.Audio 模块实现开启手机摄像头 基于html5 plus http://www.html5plus.org/doc/zh_cn/audio.html 栗子: <!DOCTYPE html ...

  7. tar命令-解压和压缩文件

    tar命令 可以用来压缩打包单文件.多个文件.单个目录.多个目录. Linux打包命令_tar tar命令可以用来压缩打包单文件.多个文件.单个目录.多个目录. 常用格式: 单个文件压缩打包 tar ...

  8. O2O场景下的推荐排序模型:

    推荐系统遇上深度学习(五)--Deep&Cross Network模型理论和实践 发表: 2018-04-22 推荐系统遇上深度学习系列:推荐系统遇上深度学习(一)--FM模型理论和实践:ht ...

  9. 论文阅读笔记六十一:Selective Kernel Networks(SKNet CVPR2019)

    论文原址:https://arxiv.org/pdf/1903.06586.pdf github: https://github.com/implus/SKNet 摘要 在标准的卷积网络中,每层网络中 ...

  10. 权限维持:Win2008以上的iis

    参考文章:https://mp.weixin.qq.com/s/z1d3yvp14GWakyonTh_b8A 浅谈原理 在 .Net 中,HttpModule 其实就是实现了 IHttpModule ...