insert高階語法
有這樣一個業務需求,要求根據不同條件將源資料插入到不同的表中,源資料表更新十分頻繁,這樣的一個業務需求應該怎麼做呢?我先給出源表結構和需要插入的表結構:
更新十分頻繁的源表:
create table people(id number,name varchar2(20),sex char(3),address varchar2(500));
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,更多的精彩業務實現,還等著我們去探索。
更新十分頻繁的源表:
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結果,如圖所示:
待插入的幾張表結構: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部落格 ” ,連結:http://blog.itpub.net/30485601/viewspace-2151152/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Typescript 高階語法進階TypeScript
- INSERT高階應用
- PHP高階語法總結PHP
- Java高階語法之反射Java反射
- SQL 高階語法 MERGE INTOSQL
- python高階語法:繼承性Python繼承
- 第十一章、高階語法與用法
- 15 個常用的 SQL Server 高階語法SQLServer
- Google高階搜尋技巧之高階語法查詢指令Go
- 高階前端基礎-JavaScript抽象語法樹AST前端JavaScript抽象語法樹AST
- Gradle入門系列(二)——groovy高階語法Gradle
- Gradle學習之三Groovy高階語法Gradle
- “高階”的程式語言是否真的高階?
- mysql update join,insert select 語法MySql
- Oracle中 Update和insert結合語法Oracle
- 高階C語言1C語言
- 高階C語言2C語言
- 高階C語言7C語言
- PJzhang:搜尋引擎高階語法與滲透測試
- 成為Python大牛必須要掌握的高階語法——yieldPython
- mysql高階查詢語句MySql
- 從高階語言到機器語言
- 高階SWOT分析法(轉載)
- 從一知半解到揭曉Java高階語法—泛型Java泛型
- 《Python高階程式設計(第2版)》之語法最佳實踐Python程式設計
- Hive語法及其進階(二)Hive
- python是高階語言嗎Python
- MySQL高階部分-建表語句MySql
- c#語言-高階函式C#函式
- JavaScript 高階—— ES6新增語法 const(let const var區別)JavaScript
- 深入理解 C++ 語法:從基礎知識到高階應用C++
- 第三章、c語言高階階段C語言
- SQLite Insert 語句SQLite
- JavaScript進階之基礎語法JavaScript
- aardio教程二) 進階語法
- SQL語言基礎(高階查詢)SQL
- 雜談現代高階程式語言
- C語言巨集的高階應用C語言