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

目 录

    • 1.场景
    • 2.实现

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

你可能感兴趣的:(SQL,Server,sqlserver,merge,into)