【SQL】使用一條INSERT語句完成多表插入
這是一條顛覆常規的插入方法,一條INSERT語句可以完成向多張表的插入任務。小小地展示一下這種插入方法。
1.建立表T並初始化測試資料,此表作為資料來源。
sec@ora10g> create table t (x number(10), y varchar2(10));
sec@ora10g> insert into t values (1,'a');
sec@ora10g> insert into t values (2,'b');
sec@ora10g> insert into t values (3,'c');
sec@ora10g> insert into t values (4,'d');
sec@ora10g> insert into t values (5,'e');
sec@ora10g> insert into t values (6,'f');
sec@ora10g> commit;
2.檢視錶T的資料
sec@ora10g> select * from t;
X Y
---------- ----------
1 a
2 b
3 c
4 d
5 e
6 f
6 rows selected.
3.建立表T1和T2,作為我們要插入的目標表。
sec@ora10g> create table t1 as select * from t where 0=1;
Table created.
sec@ora10g> create table t2 as select * from t where 0=1;
Table created.
4.第一種多表插入方法INSERT ALL
1)完成INSERT ALL插入
sec@ora10g> insert all into t1 into t2 select * from t;
12 rows created.
這裡之所以顯示插入了12條資料,實際上表示在T1表中插入了6條,T2表插入了6條,一共是12條資料。
2)驗證T1表中被插入的資料。
sec@ora10g> select * from t1;
X Y
---------- ----------
1 a
2 b
3 c
4 d
5 e
6 f
6 rows selected.
3)驗證T2表中被插入的資料。
sec@ora10g> select * from t2;
X Y
---------- ----------
1 a
2 b
3 c
4 d
5 e
6 f
6 rows selected.
OK,完成INSERT ALL命令的使命。
5.第二種多表插入方法INSERT FIRST
1)清空表T1和T2
sec@ora10g> delete from t1;
sec@ora10g> delete from t2;
sec@ora10g> commit;
2)完成INSERT FIRST插入
sec@ora10g> insert first when x>=5 then into t1 when x>=2 then into t2 select * from t;
5 rows created.
處理邏輯是這樣的,首先檢索T表查詢X列值大於等於5的資料(這裡是“5,e”和“6,f”)插入到T1表,然後將前一個查詢中出現的資料排除後再查詢T表,找到X列值大於等於2的資料再插入到T2表(這裡是“2,b”、“3,c”和“4,d”)。注意INSERT FIRST的真正目的是將同樣的資料只插入一次。
3)驗證T1表中被插入的資料。
sec@ora10g> select * from t1;
X Y
---------- ----------
5 e
6 f
4)驗證T2表中被插入的資料。
sec@ora10g> select * from t2;
X Y
---------- ----------
2 b
3 c
4 d
5)為真實的反映“資料只插入一次”的目的,我們把條件顛倒後再插入一次。
sec@ora10g> delete from t1;
sec@ora10g> delete from t2;
sec@ora10g> insert first when x>=2 then into t1 when x>=5 then into t2 select * from t;
5 rows created.
sec@ora10g> select * from t1;
X Y
---------- ----------
2 b
3 c
4 d
5 e
6 f
sec@ora10g> select * from t2;
no rows selected
OK,目的達到,可見滿足第二個條件的資料已經包含在第一個條件裡,所以不會有資料插入到第二張表。
同樣的插入條件,我們把“INSERT FIRST”換成“INSERT ALL”,對比一下結果。
sec@ora10g> delete from t1;
5 rows deleted.
sec@ora10g> delete from t2;
0 rows deleted.
sec@ora10g> insert all when x>=2 then into t1 when x>=5 then into t2 select * from t;
7 rows created.
sec@ora10g> select * from t1;
X Y
---------- ----------
2 b
3 c
4 d
5 e
6 f
sec@ora10g> select * from t2;
X Y
---------- ----------
5 e
6 f
是不是在豁然開朗的基礎上又有一種錦上添花的感覺。That's it.
6.Oralce官方文件參考連結
7.小結
這些小小小的高階SQL技巧在實際的應用中有很大用處。慢慢體會吧。
Good luck.
secooler
10.01.06
-- The End --
1.建立表T並初始化測試資料,此表作為資料來源。
sec@ora10g> create table t (x number(10), y varchar2(10));
sec@ora10g> insert into t values (1,'a');
sec@ora10g> insert into t values (2,'b');
sec@ora10g> insert into t values (3,'c');
sec@ora10g> insert into t values (4,'d');
sec@ora10g> insert into t values (5,'e');
sec@ora10g> insert into t values (6,'f');
sec@ora10g> commit;
2.檢視錶T的資料
sec@ora10g> select * from t;
X Y
---------- ----------
1 a
2 b
3 c
4 d
5 e
6 f
6 rows selected.
3.建立表T1和T2,作為我們要插入的目標表。
sec@ora10g> create table t1 as select * from t where 0=1;
Table created.
sec@ora10g> create table t2 as select * from t where 0=1;
Table created.
4.第一種多表插入方法INSERT ALL
1)完成INSERT ALL插入
sec@ora10g> insert all into t1 into t2 select * from t;
12 rows created.
這裡之所以顯示插入了12條資料,實際上表示在T1表中插入了6條,T2表插入了6條,一共是12條資料。
2)驗證T1表中被插入的資料。
sec@ora10g> select * from t1;
X Y
---------- ----------
1 a
2 b
3 c
4 d
5 e
6 f
6 rows selected.
3)驗證T2表中被插入的資料。
sec@ora10g> select * from t2;
X Y
---------- ----------
1 a
2 b
3 c
4 d
5 e
6 f
6 rows selected.
OK,完成INSERT ALL命令的使命。
5.第二種多表插入方法INSERT FIRST
1)清空表T1和T2
sec@ora10g> delete from t1;
sec@ora10g> delete from t2;
sec@ora10g> commit;
2)完成INSERT FIRST插入
sec@ora10g> insert first when x>=5 then into t1 when x>=2 then into t2 select * from t;
5 rows created.
處理邏輯是這樣的,首先檢索T表查詢X列值大於等於5的資料(這裡是“5,e”和“6,f”)插入到T1表,然後將前一個查詢中出現的資料排除後再查詢T表,找到X列值大於等於2的資料再插入到T2表(這裡是“2,b”、“3,c”和“4,d”)。注意INSERT FIRST的真正目的是將同樣的資料只插入一次。
3)驗證T1表中被插入的資料。
sec@ora10g> select * from t1;
X Y
---------- ----------
5 e
6 f
4)驗證T2表中被插入的資料。
sec@ora10g> select * from t2;
X Y
---------- ----------
2 b
3 c
4 d
5)為真實的反映“資料只插入一次”的目的,我們把條件顛倒後再插入一次。
sec@ora10g> delete from t1;
sec@ora10g> delete from t2;
sec@ora10g> insert first when x>=2 then into t1 when x>=5 then into t2 select * from t;
5 rows created.
sec@ora10g> select * from t1;
X Y
---------- ----------
2 b
3 c
4 d
5 e
6 f
sec@ora10g> select * from t2;
no rows selected
OK,目的達到,可見滿足第二個條件的資料已經包含在第一個條件裡,所以不會有資料插入到第二張表。
同樣的插入條件,我們把“INSERT FIRST”換成“INSERT ALL”,對比一下結果。
sec@ora10g> delete from t1;
5 rows deleted.
sec@ora10g> delete from t2;
0 rows deleted.
sec@ora10g> insert all when x>=2 then into t1 when x>=5 then into t2 select * from t;
7 rows created.
sec@ora10g> select * from t1;
X Y
---------- ----------
2 b
3 c
4 d
5 e
6 f
sec@ora10g> select * from t2;
X Y
---------- ----------
5 e
6 f
是不是在豁然開朗的基礎上又有一種錦上添花的感覺。That's it.
6.Oralce官方文件參考連結
7.小結
這些小小小的高階SQL技巧在實際的應用中有很大用處。慢慢體會吧。
Good luck.
secooler
10.01.06
-- The End --
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/519536/viewspace-624545/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【SQL】9 SQL INSERT INTO 語句SQL
- SQL INSERT INTO 語句詳解:插入新記錄、多行插入和自增欄位SQL
- oracle-資料庫- insert 插入語句Oracle資料庫
- 用一條mysql語句插入多條資料MySql
- MySQL 匯出一條資料的插入語句MySql
- 教你使用SQLite-insert語句SQLite
- 【SQL】14 UNION 操作符、SELECT INTO 語句、INSERT INTO SELECT 語句、CREATE DATABASE 語句、CREATE TABLE 語句SQLDatabase
- 使用sql語句查詢平均值,使用sql語句查詢資料總條數, not in 篩選語句的使用SQL
- SQL INSERT批次插入方式SQL
- SQLite Insert 語句SQLite
- 一條sql語句的執行過程SQL
- [20181114]一條sql語句的優化.txtSQL優化
- 寫入請求轉換為一條SQL insert 語句發給後設資料叢集SQL
- Mysql跨表更新 多表update sql語句總結MySql
- PL/SQL 條件控制語句SQL
- insert into select語句與select into from語句
- 一條SQL更新語句是如何執行的?SQL
- 一條SQL更新語句是如何執行的SQL
- 一條update SQL語句是如何執行的SQL
- insert all和insert first語句的用法
- 一條 SQL 查詢語句是如何執行的?SQL
- 一條更新的SQL語句是如何執行的?SQL
- 一條SQL語句在MySQL中如何執行的MySql
- SQL語句將查詢結果插入到另一張表中SQL
- 一條 SQL 語句在 MySQL 中是如何執行的?MySql
- 執行一條 SQL 語句,期間發生了什麼?SQL
- 執行一條sql語句都經歷了什麼?SQL
- 一條sql語句在mysql中是如何執行的MySql
- Mybatis連線池_動態sql語句_多表查詢實現MyBatisSQL
- 查詢策略選擇:使用 JOIN 還是多條 SQL 語句SQL
- 手擼Mysql原生語句--多表MySql
- 多表查詢建表語句
- ORACLE多表關聯UPDATE語句Oracle
- [20181120]奇怪的insert語句.txt
- SQL 常用語句一覽SQL
- [20231114]如何知道一條sql語句涉及到那些表.txtSQL
- MySQL日誌(一條sql更新語句是如何執行的)MySql
- MySQL:一個簡單insert語句的大概流程MySql
- Java中如何解析SQL語句、格式化SQL語句、生成SQL語句?JavaSQL