SQL 使用一條INSERT語句完成多表插入

2021-05-18 07:07:49 字數 3355 閱讀 9087

這是一條顛覆常規的插入方法,一條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 a2 b

3 c4 d

5 e6 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 a2 b

3 c4 d

5 e6 f

6 rows selected.

3)驗證t2表中被插入的資料。

sec@ora10g> select * from t2;

x y---------- ----------

1 a2 b

3 c4 d

5 e6 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 e6 f

4)驗證t2表中被插入的資料。

sec@ora10g> select * from t2;

x y---------- ----------

2 b3 c

4 d5)為真實的反映「資料只插入一次」的目的,我們把條件顛倒後再插入一次。

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 b3 c

4 d5 e

6 fsec@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 b3 c

4 d5 e

6 fsec@ora10g> select * from t2;

x y---------- ----------

5 e6 f

是不是在豁然開朗的基礎上又有一種錦上添花的感覺。that's it.

6.oralce官方文件參考鏈結

7.小結

這些小小小的高階sql

技巧在實際的應用中有很大用處。慢慢體會吧。

good luck.

secooler

10.01.06

-- the end --

使用一條INSERT語句完成多表插入

這是一條顛覆常規的插入方法,一條insert語句可以完成向多張表的插入任務。小小地展示一下這種插入方法。1.建立表t並初始化測試資料,此表作為資料來源。sec ora10g create table t x number 10 y varchar2 10 sec ora10g insert into...

一條SQL語句研究

現有 select from t where a in 5,3,2,1,8,9,30.假設 a 是主鍵,in裡面的引數是唯一的。現要求輸出的結果集按照 in 提供的引數順序排序。而不是按照a本身的排序規則排序?另 如果不要求使用臨時表或表變數,那麼又有什麼辦法實現。臨時表方案參卡 create ta...

一條insert語句批量插入多條記錄

常見的insert語句,向資料庫中,一條語句只能插入一條資料 一條insert只能插入一條資料 insert into person id,personcode,personname telnumber values 1,5112403 張三 1378902134 一次插入多條資料的方法 方式一 i...