zoukankan      html  css  js  c++  java
  • oracle 中merge的用法

    ///MERGE语句是Oracle9i新增的语法,用来合并UPDATE和INSERT语句。通过MERGE语句,根据一张表或子查询的连接条件对另外一张表进行查询,连接条件匹配上的进行UPDATE,无法匹配的执行INSERT。这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于INSERT+UPDATE。

    //表1
    create table subs(msid number(9),
                      ms_type char(1),
                     areacode number(3)
                     );
    //表2
    create table acct(msid number(9),
                      bill_month number(6),
                      areacode   number(3),
                      fee        number(8,2) default 0.00);
                     
    //测试数据                 
    insert into subs values(905310001,0,531);
    insert into subs values(905320001,1,532);
    insert into subs values(905330001,2,533);
    commit;
    一.下面先演示一下merge的基本功能
    1) matched 和not matched clauses 同时使用
       merge into acct a
         using subs b on (a.msid=b.msid)
       when MATCHED then
            update set a.areacode=b.areacode
       when NOT MATCHED then
            insert(msid,bill_month,areacode)
            values(b.msid,'200702',b.areacode);
    2) 只有not matched clause,也就是只插入不更新
       merge into acct a
         using subs b on (a.msid=b.msid)  
       when NOT MATCHED then
            insert(msid,bill_month,areacode)
            values(b.msid,'200702',b.areacode);
    3) 只有matched clause, 也就是只更新不插入
       merge into acct a
         using subs b on (a.msid=b.msid)
       when MATCHED then
            update set a.areacode=b.areacode

    二.10g中增强一:条件操作
    1) matched 和not matched clauses 同时使用
       merge into acct a
         using subs b on (a.msid=b.msid)    
       when MATCHED then
            update set a.areacode=b.areacode
            where b.ms_type=0
       when NOT MATCHED then
            insert(msid,bill_month,areacode)
            values(b.msid,'200702',b.areacode)
            where b.ms_type=0;
    2) 只有not matched clause,也就是只插入不更新
       merge into acct a
         using subs b on (a.msid=b.msid)  
       when NOT MATCHED then
            insert(msid,bill_month,areacode)
            values(b.msid,'200702',b.areacode)
            where b.ms_type=0;
    3) 只有matched clause, 也就是只更新不插入
       merge into acct a
         using subs b on (a.msid=b.msid)
       when MATCHED then
            update set a.areacode=b.areacode
            where b.ms_type=0;
    三.10g中增强二:删除操作
    merge into acct a
         using subs b on (a.msid=b.msid)
       when MATCHED then
            update set a.areacode=b.areacode       
            delete where (b.ms_type!=0);

    注意:
    1.MERGE语句的UPDATE不能修改用于连接的列,否则会报错(on 后面的条件列就是联接)
    2.using 后面可以是(SELECT msid ,areacode FROM subs GROUP by msid )
    3.使用MERGE最常见的错误,造成这个错误的原因是由于通过连接条件得到的acct的记录不唯一

  • 相关阅读:
    [WC2010]重建计划
    [Codeforces150E] Freezing with Style
    [Codeforces915F] Imbalance Value of a Tree
    [Codeforces1055F] Tree and XOR
    [Codeforces1117G]Recursive Queries
    [Codeforces587F]Duff is Mad
    [Codeforces547E]Mike and Friends
    [2020团体程序设计天梯赛-总决赛L3-2] 传送门
    第05组 Beta冲刺 (1/5)
    第05组 Alpha冲刺 总结
  • 原文地址:https://www.cnblogs.com/kelly/p/1287613.html
Copyright © 2011-2022 走看看