oracle merge into用法

用途:
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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29119536/viewspace-1562385/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值