SQL Server的Merge —— 一步实现 insert,update,delete

USE tempdb
GO
IF OBJECT_ID('SourceTable') IS NOT NULL
DROP TABLE SourceTable
IF OBJECT_ID('TargetTable') IS NOT NULL
DROP TABLE TargetTable

--源
CREATE TABLE SourceTable(id INT,[desc] NVARCHAR(50))
--目标
CREATE TABLE TargetTable(id INT,[desc] NVARCHAR(50))

--源表数据
INSERT INTO SourceTable VALUES (1,'描述1'),(2,'描述2'),(3,'描述3'),(4,'描述4')

--目标表数据
INSERT INTO TargetTable VALUES (1,'在源表里存在,将会被更新')
INSERT INTO TargetTable VALUES (2,'在源表里存在,将会被更新')
INSERT INTO TargetTable VALUES (5,'在源表里不存在,将会被删除')
INSERT INTO TargetTable VALUES (6,'在源表里不存在,将会被删除')

SELECT * FROM SourceTable AS st
/*
id  desc
1   描述1
2   描述2
3   描述3
4   描述4
*/

SELECT * FROM TargetTable AS tt
/*
id  desc
1   在源表里存在,将会被更新
2   在源表里存在,将会被更新
5   在源表里不存在,将会被删除
6   在源表里不存在,将会被删除 
*/

--注意事项 
--1.最后的分号必须有
--2.源表可以是一个具体的表,也可以是一个子查询语句
--3.2008或以上版本才有的功能

MERGE INTO TargetTable AS T     --可添加 TOP 限制操作行数: MERGE TOP(2)
USING SourceTable AS S
ON T.id=S.id
WHEN MATCHED            --当两者的id能匹配,id=1,2的数据被更新
    THEN UPDATE SET T.[desc]=s.[desc]
WHEN NOT MATCHED        --目标表没有的ID, 在原表中有,则插入相关的数据
    THEN INSERT VALUES(s.id,s.[desc])
WHEN NOT MATCHED BY SOURCE --目标表中存在,源表不存在,则删除
    THEN DELETE
OUTPUT $ACTION AS [Action]
    ,INSERTED.id AS [插入的id]
    ,INSERTED.[desc] AS [插入的DESC]
    ,DELETED.id AS [删除的id]
    ,DELETED.[desc] AS [删除的DESC]
;
/*
Action  插入的id   插入的DESC 删除的id   删除的DESC
INSERT  3             描述3          NULL         NULL
INSERT  4             描述4          NULL         NULL
UPDATE  1             描述1          1        在源表里存在,将会被更新
UPDATE  2             描述2          2        在源表里存在,将会被更新
DELETE  NULL          NULL         5        在源表里不存在,将会被删除
DELETE  NULL          NULL         6        在源表里不存在,将会被删除 
*/

SELECT * FROM SourceTable AS st
/*
id  desc
1   描述1
2   描述2
3   描述3
4   描述4 
*/
SELECT * FROM TargetTable AS tt
/*
id  desc
1   描述1
2   描述2
3   描述3
4   描述4
*/
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值