SQL Server MERGE(合并)语句
如何使用SQL Server MERGE语句基于与另一个表匹配的值来更新表中的数据。
SQL Server MERGE语句
假设有两个表,分别称为源表和目标表,并且需要根据与源表匹配的值来更新目标表。有以下三种情况:
- 源表中有一些目标表中不存在的行。在这种情况下,需要将源表中的行插入目标表中。
- 目标表中的某些行在源表中不存在。在这种情况下,需要从目标表中删除行。
- 源表中的某些行与目标表中的行具有相同的键。但是,这些行在非键列中具有不同的值。在这种情况下,需要使用源表中的值更新目标表中的行。
下图说明了源表和目标表以及相应的操作:插入,更新和删除:

如果使用INSERT,UPDATE以及DELETE单独的语句,你必须建立三个单独的语句从源表匹配的行更新数据到目标表。
但是,SQL Server提供了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;
首先,在MERGE子句中指定目标表和源表。
其次,merge_condition确定源表中的行与目标表中的行如何匹配。它类似于join子句中的join条件。通常,使用主键或唯一键的键列进行匹配。
三,merge_condition结果有三种状态:MATCHED,NOT MATCHED,和NOT MATCHED BY SOURCE。
MATCHED:这些是符合合并条件的行。对于匹配的行,需要使用源表中的值更新目标表中的行列。
NOT MATCHED:这些是源表中的行,目标表中没有任何匹配的行。在这种情况下,需要将源表中的行添加到目标表中。请注意,NOT MATCHED也称为NOT MATCHED BY TARGET。
NO MATCHED BY SOURCE:这些是目标表中的行,与源表中的任何行都不匹配。如果要使目标表与源表中的数据同步,则需要使用此匹配条件从目标表中删除行。
SQL Server MERGE语句示例
假设我们有两个表,sales.category并且sales.category_staging按产品类别存储销售额。
CREATE TABLE sales.category (
category_id INT PRIMARY KEY,
category_name VARCHAR(255) NOT NULL,
amount DECIMAL(10 , 2 )
); INSERT INTO sales.category(category_id, category_name, amount)
VALUES(1,'自行车',15000),
(2,'摩托车',25000),
(3,'汽车',13000),
(4,'火车',10000); CREATE TABLE sales.category_staging (
category_id INT PRIMARY KEY,
category_name VARCHAR(255) NOT NULL,
amount DECIMAL(10 , 2 )
); INSERT INTO sales.category_staging(category_id, category_name, amount)
VALUES(1,'自行车',15000),
(3,'汽车',13000),
(4,'火车',20000),
(5,'飞机',10000),
(6,'火箭',10000);
要使用(源表)中sales.category的值将数据更新到(目标sales.category_staging表),使用以下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合并示例
在此示例中,我们将category_id两个表中的列中的值用作合并条件。
- 首先,sales.category_staging表中ID为1、3、4的行与目标表中的行匹配,因此,该MERGE语句更新了表中类别名称和数量列中的值sales.category。
- 其次,sales.category_staging表中ID为5和6的行在表中不存在sales.category,因此该MERGE语句将这些行插入到目标表中。
- 第三,sales.category表中ID为2的行在表中不存在sales.sales_staging,因此,该MERGE语句删除了该行。


合并的结果是,sales.category表中的数据与sales.category_staging表中的数据完全同步 。

SQL Server MERGE(合并)语句的更多相关文章
- SQL server 查看什么语句在使用临时表
SQL server 查询那些语句在使用临时表 最近在日常的性能测试工作中发现,数据库端的IO读写比较大,有规律的2-8M的波动,数据库的版本为 SQL server 2008 sp3. 这些IO操作 ...
- SQL Server Merge语句的使用
Merge关键字在SQL Server 2008被引入,它能将Insert,Update,Delete简单的并为一句.MSDN对于Merge的解释非常的短小精悍:”根据与源表联接的结果,对目标表执行插 ...
- SQL Server MERGE
Merge关键字是一个神奇的DML关键字.它在SQL Server 2008被引入,它能将Insert,Update,Delete简单的并为一句.MSDN对于Merge的解释非常的短小精悍:”根据与源 ...
- SQL Server读懂语句运行的统计信息 SET STATISTICS TIME IO PROFILE ON
对于语句的运行,除了执行计划本身,还有一些其他因素要考虑,例如语句的编译时间.执行时间.做了多少次磁盘读等. 如果DBA能够把问题语句单独测试运行,可以在运行前打开下面这三个开关,收集语句运行的统计信 ...
- SQL Server中CURD语句的锁流程分析
我只在数据库选项已开启“行版本控制的已提交读”(READ_COMMITTED_SNAPSHOT为ON)中进行了观察. 因此只适用于这种环境的数据库. 该类数据库支持四种不同事务隔离级别,下面分别观察数 ...
- SQL Server ---T-SQl基本语句
T-SQL 是 SQL-Server 的结构化查询语言. 基本数据操作语言. 基础语句 先创建表 我后面的列子都是用的这一个表,列名啥的 就大概看看吧~~ 纯粹为了学习语句,语法~~所以先创建个表吧~ ...
- SQL Server 基本SELECT语句
1.SELECT 和 FROM 语句 SELECT表示执行的是查询,接着需要更知道从哪边查询数据,FROM就是限制读取的数据在哪一个表或哪几个表中,这样就构成了一个基本语句. SELECT * FRO ...
- SQL server中获取语句执行时间
在写代码的时候,有时候实现一个功能会有好多个方法,有时候会做一下方法的耗时对比,综合下时间复杂度与空间复杂度,写出最好的代码: 同样,在写一些SQL查询,SQL代码的时候,也希望能写出一个高效一点的查 ...
- SQL Server order by语句学习回顾
主要学习: 1.以指定的次序返回查询结果 2.按多个字段排序 3.按字串排序 4.处理排序空值 5.根据数据项的键排序 具体实例1---以指定的次序返回查询结果 n使用ORDER BY子句可以对结果集 ...
随机推荐
- 关于ArrayList
List概述 List是一个列表结构抽象定义,有序的,可对其中每个元素的插入位置进行精确地控制,可以通过索引来访问元素,遍历元素.包括函数的有:添加元素,删除元素,判断是否包含元素等等重要函数. ...
- frp开机启动
暂时只介绍linux版本的做法,作为备忘. 添加systemd配置文件: vim /usr/lib/systemd/system/frp.service 文件内容如下: [Unit] Descript ...
- C++中list的用法总结
list简介 list 也是顺序容器的一种.只是list 是一个双向链表.使用 list 需要包含头文件 list.双向链表的每个元素中都有一个指针指向后一个元素,也有一个指针指向前一个元素,如下图所 ...
- 【jmeter】Include Controller控件&Test Fragment的使用
概念:简单说下Include Controller引用Test Fragment片段 Include Controller控件——给当前jmeter脚本引入外部片段的jmeter脚本(Test Fra ...
- K8S集群搭建——基于CentOS 7系统
环境准备集群数量此次使用3台CentOS 7系列机器,分别为7.3,7.4,7.5 节点名称 节点IPmaster 192.168.0.100node1 192.168.0.101node2 192. ...
- Net core学习系列(八)——Net Core日志
一.简介# 日志组件,作为程序员使用频率最高的组件,给程序员开发调试程序提供了必要的信息.ASP.NET Core中内置了一个通用日志接口ILogger,并实现了多种内置的日志提供器,例如 Conso ...
- RNN 的不变性
卷积神经网络的不变性 不变性的实现主要靠两点:大量数据(各种数据):网络结构(pooling)不变性的类型 1)平移不变性 卷积神经网络最初引入局部连接和空间共享,就是为了满足平移不变性. ...
- PHP系列 | PDO::prepare(): send of 68 bytes failed with errno=32 Broken pipe
设计场景 1.开启Redis的键空间过期事件(键过期发布任务),创建订单创建一个过期的key,按照订单号为key,设置过期时间. 2.通过Redis的订阅模式(持久阻塞),获取到订单号进行组装. 3. ...
- 《Go语言实战》读书笔记
<Go语言实战>中文版pdf 百度网盘: https://pan.baidu.com/s/1kr-gMzaPAn8BFZG0P24Oiw 提取码: r6rt 书籍源码:https://gi ...
- Python适合练手的项目
原文地址:https://www.jianshu.com/p/039156321e30 项目地址:https://github.com/DeqianBai/Python-Project/tree/ma ...