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