SQL Server有则更新,无则插入操作之merge into

1.场景

  sql server假设目标表rpt.tbb_student被前端报表无缝链接,或被其它库订阅,则在更新表rpt.tbb_student就不能用全删全插的理念,这个时候就会有个思路有则更新,无则插入的增量理念;
  sql server天生就自带这种语法merge into,有的人疑问了,那我直接写两段语句,一段update,一段insert不行吗?答案当然是可以的,只是这种做法相对于merge into效率较低,不够优化,因为这样的两段语句需要扫描表两次,时间复杂度为2n;而merge into只要扫描表一次就把事情做完了,时间复杂度为n;

2.实现


# 创建目标表rpt.tbb_student
create table rpt.tbb_student
(
    id bigint  not null identity(1,1)
   ,sno varchar(50) primary key
   ,sname varchar(100) 
   ,ssex varchar(10)
   ,sage int 
   ,sclassid bigint
)
;
go

# 创建源表stg.tbb_student
create table stg.tbb_student
(
    id bigint  not null identity(1,1)
   ,sno varchar(50) primary key
   ,sname varchar(100) 
   ,ssex varchar(10)
   ,sage int 
   ,sclassid bigint
)
;
go

// 插入3条测试数据
insert into  stg.tbb_student
values
('s1','rowyet','m',18,1),
('s2','lily','w',15,1),
('s3','zed','m',20,2);

// 查看stg.tbb_student表,有3条数据
select * from  stg.tbb_student;

// 查看rpt.tbb_student表,有0条数据
select * from  rpt.tbb_student;

// 执行merge into 操作
merge into rpt.tbb_student rts
using stg.tbb_student sts
   on rts.sno=sts.sno
 // 能匹配上则更新
 when matched
 then update set 
 rts.sname=sts.sname
,rts.ssex=sts.ssex
,rts.sage=sts.sage
,rts.sclassid=sts.sclassid
 // 不能匹配上则插入
when not matched
then insert values( sts.sno
,sts.sname
,sts.ssex
,sts.sage
,sts.sclassid
);

// 再查看stg.tbb_student表,有3条数据
select * from  stg.tbb_student;

// 再查看rpt.tbb_student表,有3条数据
select * from  rpt.tbb_student;

  高效率的sql server的merge into语法就实现了;注意:其它数据库未必有,请根据数据库语法自行斟酌;

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

╭⌒若隐_RowYet——大数据

谢谢小哥哥,小姐姐的巨款

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值