使用 INSERT ALL / FIRST 同時 INSERT 多個 TABLE

使用 INSERT ALL / FIRST 同時 INSERT 多個 TABEL

參考:http://blog.csdn.net/nsj820/article/details/6238237

ALL FIRST 的區別

ALL: 不考慮先後關係,只要滿足條件,就全部插入;

FIRST: 考慮先後關係,如果有數據滿足第一個when條件又滿足第二個when條件,則執行第一個then插入語句,第二個then就不插入第一個then已經插入過的數據了。

其區別也可描述為,ALL 只要滿足條件,可能會作重複插入;FIRST 首先要滿足條件,然後篩選,不做重複插入。


--(1) 將相同資料新增至不同 Table 中
INSERT ALL
INTO table_A a (a.ColumnA1,a.ColumnA2,a.ColumnA3,a.ColumnA4)
          VALUES (c.ColumnC1,c.ColumnC2,c.ColumnC3,c.ColumnC4)
INTO table_B b (b.ColumnB1,b.ColumnB2,b.ColumnB3)
          VALUES (c.ColumnC1,'ABC',c.ColumnC3)
SELECT c.ColumnC1,c.ColumnC2,c.ColumnC3,c.ColumnC4 FROM table_C c;

--(2) 增加條件, 並將資料新增至不同 Table 中
INSERT ALL
WHEN c.ColumnC5 = 1 THEN 
  INTO table_A a(a.ColumnA1,a.ColumnA2,a.ColumnA3,a.ColumnA4)
          VALUES(c.ColumnC1,c.ColumnC2,c.ColumnC3,c.ColumnC4)
ELSE
  INTO table_B b(b.ColumnB1,b.ColumnB2,b.ColumnB3)
          VALUES(c.ColumnC1,'ABC',c.ColumnC3)
SELECT c.ColumnC1,c.ColumnC2,c.ColumnC3,c.ColumnC4 FROM table_C c;

--(3) 多個條件, 將資料新增至不同 Table 中, 若某一筆資料的 c.ColumnC5 = 1, 
        而且同時也滿足第二個條件  c.ColumnC5 >= 1, 那麼 table_A 與 table_B 皆會插入資料
INSERT ALL
WHEN c.ColumnC5 = 1 THEN 
  INTO table_A a(a.ColumnA1,a.ColumnA2,a.ColumnA3,a.ColumnA4)
          VALUES(c.ColumnC1,c.ColumnC2,c.ColumnC3,c.ColumnC4)
WHEN c.ColumnC5 >= 1 THEN
  INTO table_B b(b.ColumnB1,b.ColumnB2,b.ColumnB3)
          VALUES(c.ColumnC1,'ABC',c.ColumnC3)
SELECT c.ColumnC1,c.ColumnC2,c.ColumnC3,c.ColumnC4 FROM table_C c;

--INSERT FIRST
--(4) 多個條件, 將資料新增至不同 Table 中, 若某一筆資料的 c.ColumnC5 = 1, 
        而且同時也滿足第二個條件  c.ColumnC5 >= 1, 那麼 table_A 會插入資料,  table_B 不會插入資料
INSERT FIRST
WHEN c.ColumnC5 = 1 THEN 
  INTO table_A a(a.ColumnA1,a.ColumnA2,a.ColumnA3,a.ColumnA4)
          VALUES(c.ColumnC1,c.ColumnC2,c.ColumnC3,c.ColumnC4)
WHEN c.ColumnC5 >= 1 THEN
  INTO table_B b(b.ColumnB1,b.ColumnB2,b.ColumnB3)
          VALUES(c.ColumnC1,'ABC',c.ColumnC3)
SELECT c.ColumnC1,c.ColumnC2,c.ColumnC3,c.ColumnC4 FROM table_C c;
commit;