ITPub博客

首页 > 数据库 > Oracle > insert高级语法

insert高级语法

原创 Oracle 作者:tangguowuvv 时间:2018-02-22 20:57:48 0 删除 编辑
有这样一个业务需求,要求根据不同条件将源数据插入到不同的表中,源数据表更新十分频繁,这样的一个业务需求应该怎么做呢?我先给出源表结构和需要插入的表结构:
更新十分频繁的源表:
create table people(id number,name varchar2(20),sex char(3),address varchar2(500));
给源表插入数据:
insert into people 
values(1,'张翠山','男','武当山');
insert into people 
values(2,'殷素素','女','天鹰教');
insert into people 
values(3,'张无忌','男','明教');
insert into people 
values(4,'赵敏','女','皇室');
insert into people 
values(5,'周芷若','女','峨眉山');
insert into people 
values(6,'成昆','男','少林寺');
commit;
查询一下people结果,如图所示:

待插入的几张表结构:
create table people_1(id number,name varchar2(20));
create table people_2(id number,sex char(3));
create table people_3(sex char(3),address varchar2(500));
现在的业务需求是,将ID<=4的记录插入到people_1中,SEX='男'的插入到people_2,剩下的插入到people_3中。乍一看,此需求可以这样做insert into people_1 select id,name from people where id<=4; insert into people_2 select id,sex from people where SEX='男'; insert into people_3 select sex,sddress from people where id>4 and SEX!='男';但是people是一个频繁DML的表,如果分成这样子三步执行,在数据量特别大的情况下,每步插入操作会消耗较长时间,在这一段时间之内,又会有大批量数据改变,导致三步操作的表数据基数都不一样,结果当然会有偏差。因此,在这里我们用到了insert的高级语法。
SQL如下:
insert all
when id<=4 then into people_1 values(id,name)
  when sex='男' then into people_2 values(id,sex)
    else into people_3 values(sex,address)
select * from people;
结果如下:
PEOPLE_1:                   PEOPLE_2:         PEOPLE_3:
           

如果我只想ID=1在people_1中插入之后就不在people_2中插入,那么可以使用insert first,它会从前到后进行判断,如果一条记录在前面已经插入,则在之后略过此条记录。
SQL如下:
insert first
when id<=4 then into people_1 values(id,name)
  when sex='男' then into people_2 values(id,sex)
    else into people_3 values(sex,address)
select * from people;
结果如下:
PEOPLE_1:                   PEOPLE_2:         PEOPLE_3:
          

当然,这个是根据条件插入的,当没有条件的时候,可以直接进行插入。
SQL如下:
insert all/first
into people_1 values(id,name)
into people_2 values(id,sex)
into people_3 values(sex,address)
select * from people;
其实很多时候,现实业务的要求oracle都为我们考虑到了,而且其性能通常强于我们自己写的PL/SQL,更多的精彩业务实现,还等着我们去探索。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30485601/viewspace-2151152/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2015-09-16

  • 博文量
    15
  • 访问量
    16929