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
语法就实现了;注意:其它数据库未必有,请根据数据库语法自行斟酌;