T-SQL——关于数据合并(Merge)
0. 背景说明及测试数据
什么是合并?
根据记录是否已经存在,决定是否插入、更新或删除
简单说明,数据库需要将某个表A的数据同步到指定的表B中,
表A和表B中字段一样,都有一样的唯一键,需要同时实现一下三种操作:
- 若表A中某条数据在表B中不存在,则在表中插入该条数据
- 若表A中某条数据在表B中存在,但是某些字段值不一样,则对表B进行更改
- 若表B中存在某条数据在表A中不存在,则删除表B中的该条记录
1. 直接清空,重新插入
- 简单粗暴:将表B清空,之后将表A中数据全部插入,即实现了上述三操作
- 此法并非万能,若是在数据库中清洗数据的时候可以这么做,但是程序中不建议
TRUNCATE TABLE tbB
INSERT INTO tbB SELECT * FROM tbA
2. 单条记录执行插入、更新操作
--创建一个临时测试数据
IF OBJECT_ID('tempdb..#temp') IS NOT NULL BEGIN
DROP TABLE #temp;
END;
CREATE TABLE #temp (Id INT, Name VARCHAR(10), CreateTime DATETIME);
INSERT INTO #temp(Id, Name, CreateTime)
VALUES(1, '张三', '2023-6-1 15:20:31'),
(2, '李四', '2023-6-1 15:25:53');
--不存在Id=2的记录则插入
IF NOT EXISTS (SELECT * FROM #temp WHERE Id=2)
BEGIN
INSERT INTO #temp(Id, Name, CreateTime)VALUES(2, '张三', GETDATE());
END;
--存在Id=2的记录则更新
ELSE
BEGIN
UPDATE #temp SET Name='李四', CreateTime=GETDATE()WHERE Id=2;
END;
SELECT * FROM #temp;
3. Merge函数
3.1 准备测试数据
IF OBJECT_ID('tempdb..#tempA') IS NOT NULL
DROP TABLE #tempA;
CREATE TABLE #tempA
(
[Id] INT,
[Name] VARCHAR(4),
[Msg] VARCHAR(100),
[CreateTime] DATETIME
);
INSERT INTO #tempA
(
[Id],
[Name],
[Msg],
[CreateTime]
)
VALUES
(1, '张三', '这是要插入的', N'2023-03-31'),
(2, '李四', '这是要更新的', N'2023-03-31');
SELECT * FROM #tempA;
--结果:
Id Name Msg CreateTime
----------- ---- -------------------- -----------------
1 张三 这是要插入的 2023-03-31
2 李四 这是要更新的 2023-03-31
IF OBJECT_ID('tempdb..#tempB') IS NOT NULL
DROP TABLE #tempB;
CREATE TABLE #tempB
(
[Id] INT,
[Name] VARCHAR(4),
[Msg] VARCHAR(100),
[CreateTime] DATETIME
);
INSERT INTO #tempB
(
[Id],
[Name],
[Msg],
[CreateTime]
)
VALUES
(2, '李四', '这是要被更新的', N'2023-01-31'),
(3, '张三', '这是要被删除的', N'2023-01-31');
SELECT * FROM #tempB;
--结果:
Id Name Msg CreateTime
----------- ---- -------------------- ----------------
2 李四 这是要被更新的 2023-01-31
3 张三 这是要被删除的 2023-01-31
3.2 测试Merge
--没要合并操作前的数据
SELECT * FROM #tempB
MERGE INTO #tempB AS T--目标表
USING #tempA AS S--源表
ON T.Id=S.Id
WHEN MATCHED --当满足 T.Id=S.Id条件时候
THEN UPDATE SET T.Name=S.Name, T.Msg=s.Msg,T.CreateTime=S.CreateTime
WHEN NOT MATCHED--当目标表中没有该Id,而源表中有,则插入
THEN INSERT VALUES(S.Id,S.Name, S.Msg,S.CreateTime)
WHEN NOT MATCHED BY SOURCE--当目标表中存在,源表中不存在,则删除
THEN DELETE;
--OUTPUT $action AS[ACTION],Inserted.Id AS [插入的Id],Inserted.Msg AS 插入的Msg,Deleted.Id AS 删除的Id,Deleted.Msg AS 删除的Msg;--输出各个操作
--合并操作后的数据
SELECT * FROM #tempB
--结果
--原始数据
Id Name Msg CreateTime
----------- ---- -------------------- -----------------------
2 李四 这是要被更新的 2023-01-31
3 王五 这是要被删除的 2023-01-31
--Merge后的数据
Id Name Msg CreateTime
----------- ---- -------------------- -----------------------
2 李四 这是要更新的 2023-03-31
1 张三 这是要插入的 2023-03-31
3.3 关于Merge
- 若原表中出现重复记录,而该记录是目标表中没有的,则会将所有的重复记录插入到目标中
- Merge关键字后面使用了多个WHEN……THEN,是可选的,可以是紧紧新增或仅仅删除
- 目标表和源表可以是一个查询结果集
4.参考
T-SQL——关于数据合并(Merge)的更多相关文章
- R语言中的横向数据合并merge及纵向数据合并rbind的使用
R语言中的横向数据合并merge及纵向数据合并rbind的使用 我们经常会遇到两个数据框拥有相同的时间或观测值,但这些列却不尽相同.处理的办法就是使用merge(x, y ,by.x = ,by.y ...
- R语言数据合并使用merge数据追加使用rbind和cbind
R语言中的横向数据合并merge及纵向数据合并rbind的使用 我们经常会遇到两个数据框拥有相同的时间或观测值,但这些列却不尽相同.处理的办法就是使用merge(x, y ,by.x = ,by.y ...
- PANDAS 数据合并与重塑(join/merge篇)
pandas中也常常用到的join 和merge方法 merge pandas的merge方法提供了一种类似于SQL的内存链接操作,官网文档提到它的性能会比其他开源语言的数据操作(例如R)要高效. 和 ...
- (Sql Server)数据的拆分和合并
(Sql Server)数据的拆分和合并 背景: 今天遇到了数据合并和拆分的问题,尝试了几种写法.但大致可分为两类:一.原始写法.二.Sql Server 2005之后支持的写法.第一种写法复杂而且效 ...
- Sql server中如何将表A和表B的数据合并(乘积方式)
sql server中如何将表A 和表B的数据合并成乘积方式,也就是说表A有2条数据,表B有3条数据,乘积后有6条数据, 这就要用到sql中的笛卡尔积方式了 1.什么是笛卡尔积 笛卡尔积在SQL中的实 ...
- Expression构建DataTable to Entity 映射委托 sqlserver 数据库里面金额类型为什么不建议用float,实例告诉你为什么不能。 sql server 多行数据合并成一列 C# 字符串大写转小写,小写转大写,数字保留,其他除外 从0开始用U盘制作启动盘装Windows10系统(联想R720笔记本)并永久激活方法 纯CSS打造淘宝导航菜单栏 C# Winform
Expression构建DataTable to Entity 映射委托 1 namespace Echofool.Utility.Common { 2 using System; 3 using ...
- SQL实用技巧:如何将表中某一列的部分数据合并到一行中
select *,stuff(select ‘,’ + fieldname from table1 for xml path(”)),1,1,”) as field from table2 for ...
- SQL将多行数据合并成一行【转】
转:https://blog.csdn.net/AntherFantacy/article/details/83824182 今天同事问了一个需求,就是将多行数据合并成一行进行显示,查询了一些资料,照 ...
- python 数据清洗之数据合并、转换、过滤、排序
前面我们用pandas做了一些基本的操作,接下来进一步了解数据的操作, 数据清洗一直是数据分析中极为重要的一个环节. 数据合并 在pandas中可以通过merge对数据进行合并操作. import n ...
- R︱高效数据操作——data.table包(实战心得、dplyr对比、key灵活用法、数据合并)
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 由于业务中接触的数据量很大,于是不得不转战开始 ...
随机推荐
- List的拆分的几种方式
开发中我们可能会遇到一个大的集合,然后我们需要对集合进行拆分,然后再对拆分的集合进行相关的操作.当然我们可以自己写一个拆分的方法,我自己写过用了不少代码,但是感觉还不是很好,最近看了不少工具才发现很多 ...
- Java的先行发生原则
先行发生原则(Happens-Before)是Java内存模型定义的一个等效判断原则.依赖这个原则,我们可以通过几条简单规则判断数据是否存在竞争,线程是否安全,而不需要陷入Java内存模型苦涩难懂的定 ...
- 【技术积累】Python中的NumPy库【一】
NumPy库是什么 NumPy是Python科学计算的核心库之一,用来进行科学计算,数值分析等矩阵运算.主要提供了以下几种功能: 1.多维数组(ndarray)对象,可以进行快速的数值计算和数组操作: ...
- 【python基础】函数-模块
函数的优点之一是,使用它们可将代码块与主程序分离.通过给函数指定函数名称,可让主程序容易理解的多.我们还可以更加细化,将函数存储在被称为模块的独立文件中,再将模块导入到主程序中.import关键字作用 ...
- 深入了解ApacheZeppelin:如何构建高效的数据科学平台
目录 引言 随着数据科学和人工智能的快速发展,如何构建高效的数据科学平台已经成为一个重要议题.Apache Zeppelin是一个开源的数据科学平台,其提供了一种简单.高效的方式来处理和存储数据,并且 ...
- PHP站群询盘订单提交过滤系统,2018年作品
//作者主页: https://www.bz80.vip header("Content-type: text/html; charset=utf-8"); //UTF8编码,避免 ...
- Spring Boot集成Dubbo 3.X
关注王有志,一个分享硬核Java技术的互金摸鱼侠 欢迎加入Java人的提桶跑路群:共同富裕的Java人 上一篇我们一起认识了Dubbo与RPC,今天我们就来一起学习如何使用Dubbo,并将Dubbo集 ...
- zabbix 主动模式下报文分析
获取监控项列表 客户端发起请求 3次握手之后,请求监控项列表: {"request":"active checks","host":&quo ...
- 部署 rsyslog 日志服务
ubuntu 服务端 + Centos 客户端 参考文档: ubuntu 20.04 搭建 rsyslog 服务器 CentOS7下搭建Rsyslog Server记录远程主机系统日志
- Redis从入门到放弃(1):安装配置
1. 介绍 Redis是一个高性能的开源key-value数据库.它被广泛应用于缓存.会话存储.实时分析.消息队列等场景.Redis具有以下三个主要特点: 数据持久化:Redis支持将内存中的数据保存 ...