oracle merge into用法

dawn009發表於2015-04-10

用途:
merge 命令可以用來用一個表中的資料來修改或者插入到另一個表。插入或者修改的操作取決於on子句的條件。

該語句可以在同一語句中執行兩步操作,可以減少執行多條insert 和update語句。

merge是一個確定性的語句,即不會在同一條merge語句中去對同一條記錄多次做修改操作。

語法:
1.into 子句
在into子句中指定所要修改或者插入資料的目標表

2.using 子句
在using子句中指定用來修改或者插入的資料來源。資料來源可以是表、檢視或者一個子查詢語句。

3.on 子句
在on子句中指定執行插入或者修改的滿足條件。在目標表中符合條件的每一行,oracle用資料來源中的相應資料修改這些行。對於不滿足條件的那些行,oracle則插入資料來源中相應資料。

4.when matched | not matched
用該子句通知oracle如何對滿足或不滿足條件的結果做出相應的操作。可以使用以下的兩類子句。

5.merge_update子句
merge_update子句執行對目標表中的欄位值修改。當在符合on子句條件的情況下執行。如果修改子句執行,則目標表上的修改觸發器將被觸發。
限制:當修改一個檢視時,不能指定一個default值

6.merge_insert 子句
merge_insert子句執行當不符合on子句條件時,往目標表中插入資料。如果插入子句執行,則目標表上插入觸發器將被觸發。
。限制:當修改一個檢視時,不能指定一個default值

merge into bonuses d

using (select employee_id, salary, department_id from employees

where department_id = 80) s

on (d.employee_id = s.employee_id)

when matched then update set d.bonus = d.bonus + s.salary*.01

when not matched then insert (d.employee_id, d.bonus)

values (s.employee_id, s.salary*0.01)

-------------------------&gt>簡單案例:
-------------------------------------        建立測試表--TEST1    ----------------------------------

 SQL>         CREATE TABLE TEST1(
      2          USERID        NUMBER,
      3          ID                  NUMBER);

Table created
--------------------------------------------------------------------------------------------------------------
----------------------------------          填充測試資料                ------------------------------- 
    
SQL> begin
  2  for i in 200..230 loop
  3  insert into test1 values(i,(i+100)/10);
  4  end loop;
  5  end;
  6  /

PL/SQL procedure successfully completed

SQL> select * from test1;

    USERID         ID
---------- ----------
       200         30
       201       30.1
       202       30.2
       203       30.3
       204       30.4
       205       30.5
       206       30.6
       207       30.7
       208       30.8
       209       30.9
       210         31
       211       31.1
       212       31.2
       213       31.3
       214       31.4
       215       31.5
       216       31.6
       217       31.7
       218       31.8
       219       31.9

    USERID         ID
---------- ----------
       220         32
       221       32.1
       222       32.2
       223       32.3
       224       32.4
       225       32.5
       226       32.6
       227       32.7
       228       32.8
       229       32.9
       230         33

31 rows selected
--------------------------------------------------------------------------------------------------------------
-----------------------------    建立測試表--TEST2 、TEST3      --------------------------------

SQL> create table test2
  2  as
  3  select userid,trunc(id,-1) id2 from test1 where length(id)=4;

Table created

SQL> select * from test2;

    USERID        ID2
---------- ----------
       201         30
       202         30
       203         30
       204         30
       205         30
       206         30
       207         30
       208         30
       209         30
       211         30
       212         30
       213         30
       214         30
       215         30
       216         30
       217         30
       218         30
       219         30
       221         30
       222         30

    USERID        ID2
---------- ----------
       223         30
       224         30
       225         30
       226         30
       227         30
       228         30
       229         30

27 rows selected

SQL> create table test3
  2  as
  3  select userid,id id3 from test1 where length(id) <> 4;

Table created

SQL> select * from test3;

    USERID        ID3
---------- ----------
       200         30
       210         31
       220         32
       230         33
--------------------------------------------------------------------------------------------------------------
-----------------------------------      測試MERGE INTO            -----------------------------------

SQL> MERGE INTO test3 t
  2  USING (SELECT userid,id2 FROM test2 WHERE id2=30) tw
  3  ON (t.userid = tw.userid)
  4  WHEN MATCHED THEN UPDATE SET t.id3=tw.id2
  5  WHEN NOT MATCHED THEN INSERT VALUES(tw.userid,tw.id2);

Done

SQL> SELECT * FROM test3;

    USERID        ID3
---------- ----------
       200         30
       210         31
       220         32
       230         33
       202         30
       201         30
       204         30
       203         30
       228         30
       217         30
       209         30
       221         30
       219         30
       227         30
       205         30
       212         30
       225         30
       208         30
       222         30
       226         30

    USERID        ID3
---------- ----------
       215         30
       218         30
       214         30
       216         30
       211         30
       224         30
       213         30
       223         30
       206         30
       207         30
       229         30

31 rows selected

SQL>

--測試完成,我們看到,test2表中的資料全部加到test3表中。

PS:

   on(condition_clause)這裡的條件句中,可以使用=,>,< 等比較運算子。

-------------------------------------          The  End        -------------------------------------------


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29119536/viewspace-1562385/,如需轉載,請註明出處,否則將追究法律責任。

相關文章