SQL Server merge用法
本文转自 https://www.cnblogs.com/Vincent-yuan/p/11521229.html
有两个表名: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(255) NOT NULL, amount DECIMAL(10 , 2 ) ); INSERT INTO sales.category(category_id, category_name, amount) VALUES(1,'Children Bicycles',15000), (2,'Comfort Bicycles',25000), (3,'Cruisers Bicycles',13000), (4,'Cyclocross Bicycles',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,'Children Bicycles',15000), (3,'Cruisers Bicycles',13000), (4,'Cyclocross Bicycles',20000), (5,'Electric Bikes',10000), (6,'Mountain Bikes',10000);
要使用 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;
执行过程如下图:
凡哥,别他妈吹牛逼了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)