shanzm-2023年9月12日 21:09:04

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)的更多相关文章

  1. R语言中的横向数据合并merge及纵向数据合并rbind的使用

    R语言中的横向数据合并merge及纵向数据合并rbind的使用 我们经常会遇到两个数据框拥有相同的时间或观测值,但这些列却不尽相同.处理的办法就是使用merge(x, y ,by.x = ,by.y ...

  2. R语言数据合并使用merge数据追加使用rbind和cbind

    R语言中的横向数据合并merge及纵向数据合并rbind的使用 我们经常会遇到两个数据框拥有相同的时间或观测值,但这些列却不尽相同.处理的办法就是使用merge(x, y ,by.x = ,by.y ...

  3. PANDAS 数据合并与重塑(join/merge篇)

    pandas中也常常用到的join 和merge方法 merge pandas的merge方法提供了一种类似于SQL的内存链接操作,官网文档提到它的性能会比其他开源语言的数据操作(例如R)要高效. 和 ...

  4. (Sql Server)数据的拆分和合并

    (Sql Server)数据的拆分和合并 背景: 今天遇到了数据合并和拆分的问题,尝试了几种写法.但大致可分为两类:一.原始写法.二.Sql Server 2005之后支持的写法.第一种写法复杂而且效 ...

  5. Sql server中如何将表A和表B的数据合并(乘积方式)

    sql server中如何将表A 和表B的数据合并成乘积方式,也就是说表A有2条数据,表B有3条数据,乘积后有6条数据, 这就要用到sql中的笛卡尔积方式了 1.什么是笛卡尔积 笛卡尔积在SQL中的实 ...

  6. 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 ...

  7. SQL实用技巧:如何将表中某一列的部分数据合并到一行中

    select *,stuff(select ‘,’ + fieldname from table1 for xml path(”)),1,1,”)  as  field from table2 for ...

  8. SQL将多行数据合并成一行【转】

    转:https://blog.csdn.net/AntherFantacy/article/details/83824182 今天同事问了一个需求,就是将多行数据合并成一行进行显示,查询了一些资料,照 ...

  9. python 数据清洗之数据合并、转换、过滤、排序

    前面我们用pandas做了一些基本的操作,接下来进一步了解数据的操作, 数据清洗一直是数据分析中极为重要的一个环节. 数据合并 在pandas中可以通过merge对数据进行合并操作. import n ...

  10. R︱高效数据操作——data.table包(实战心得、dplyr对比、key灵活用法、数据合并)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 由于业务中接触的数据量很大,于是不得不转战开始 ...

随机推荐

  1. 在国内用Java代理调用OpenAI的ChatGPT的API接口

    第一步:一个科学友好的上网工具,开启全局代理: 第二步:一个注册好的ChatGPT账号,且在个人设置里面生成apiKey:https://platform.openai.com/account/api ...

  2. CompTIA Pentest+

    关于学习后CompTIA Pentest+笔记 渗透测试工具 讲述了nmap,burp Suite,Metasploit,Nessus,hydra的入门使用 nmap:https://www.cnbl ...

  3. Java基础之基础语法与面向对象

    前言 小知识 Java由Sun公司于1995年推出,2009年Sun公司被Oracle公司收购,取得Java的版权 Java之父:James Gosling(詹姆斯·高斯林) 专业术语 JDK:jav ...

  4. docker-compose多服务器部署kafka集群

    Kafka 是一个开源的分布式事件流平台,依赖Zookeeper或者KRaft,本文基于Zookeeper. 服务器IP配置 本文使用三个服务器来做集群搭建,IP如下: nodeName IP nod ...

  5. AWSBackup:备份您的云计算资源及数据

    目录 <AWS Backup:备份您的云计算资源及数据> 背景介绍 随着云计算技术的不断普及,越来越多的企业开始将云计算资源视为其关键业务数据的潜在来源.同时,随着数据价值的不断增加,备份 ...

  6. 记一次 .NET 某医院预约平台 非托管泄露分析

    一:背景 1. 讲故事 前几天有位朋友找到我,说他的程序有内存泄露,让我帮忙排查一下,截图如下: 说实话看到 32bit, 1.5G 这些关键词之后,职业敏感告诉我,他这个可能是虚拟地址紧张所致,不管 ...

  7. zip文件结构

    转starshine博客 一个zip文件由三个部分组成:压缩源文件数据区.压缩源文件目录区.压缩源文件目录结束标志 压缩源文件数据区: 50 4B 03 04:这是头文件标记(0x04034b50) ...

  8. 【技术积累】JavaScript中的基础语法【一】

    Math对象 JavaScript中的Math对象是一个内置的数学对象,表示对数字进行数学运算的方法和属性的集合. Math对象不是一个构造函数,所以不能使用new关键字来创建一个Math对象的实例. ...

  9. Spring-Bean(二)

    环境在spring-Bean(一)的配置下 https://www.cnblogs.com/doubleconquer/p/15603706.html 来查看ApplicationContext的执行 ...

  10. Centos 8 时钟同步

    Centos 8 时钟同步使用的是 chrony 参考:https://www.cnblogs.com/my-show-time/p/14658895.html $ rpm -qa | grep ch ...