zoukankan      html  css  js  c++  java
  • 使用merge into 来更新目标表的个别字段

    --更新职业 5s
    merge into cr_gr x using
    (
    select b.custid,c.new_grbh,b.occupation /*职业*/,nvl(d.new_bm,'90') new_occupation /*新职业*/ 
    from cm002@to_db2 b
    left join scdy_grzhbh_dzb c on b.custid=c.old_grbh 
    left join scdy_tmp_zgzy_dzb d on trim(b.occupation)=d.old_bm
    where occupation<>' '
    ) new_tab
    on (x.grbh=new_tab.new_grbh )
    when matched then
    update set x.zhiye=new_tab.new_occupation;

    采用

    --通过构造临时表test_source,把前后的对照关系找清楚,并且可观测到
    merge into test_target
    using test_source
    on (test_source.id = test_target.id)--注意,如果是多条件,则 on后边一定要有个括号,把各条件都括进来
    when matched then update set test_target.name = test_source.name
    when not matched then insert values(test_source.name,test_source.id);--最后一行可以省略

    1、UPDATE或INSERT子句是可选的 
    2、UPDATE和INSERT子句可以加WHERE子句 
    3、在ON条件中使用常量过滤谓词来insert所有的行到目标表中,不需要连接源表和目标表 
    4、UPDATE子句后面可以跟DELETE子句来去除一些不需要的行 

    参考:https://blog.csdn.net/weixin_39734304/article/details/79182416

    为了对比效果

    采用其他的方式更新

    1
    update
    test_target a set a.name= ( with b as (select id,name from test_source ) select a.name from a where a.id=b.id )

    2、创建中间的临时表

    3、主表加索引

    4、update语句

    update cr_gr a set (a.zhiye,a.zhichen,a.jylx)=(
    select nvl(d.new_bm,'90'),nvl(b.techpost,'0'), nvl(d.new_bm,'90') from cm002@to_db2 b 
    left join scdy_grzhbh_dzb c on b.custid=c.old_grbh 
    left join scdy_tmp_zgzy_dzb d on  b.occupation=d.old_bm
    where c.new_grbh=a.grbh);
    测试语句
    
    
    drop table  t_stat;
    create table t_stat(a1 int,b1 int,C1 varchar2(20));
    insert into t_stat select level,mod(level,1000), null from dual connect by level<=100000;
    commit;
    select count(1) from T_STAT t;--10万条数据
    
    select * from t_stat;
    ---构造B表
    drop table  t_ref;
    create table t_ref(b1 int,C2  varchar2(20));
    insert into t_ref select mod(level,1000),null from dual connect by level<=1000;
    update t_ref set c2='能更' where b1<=500; 
    update t_ref set c2='' where b1>500; 
    
    commit;
    
    ------------------开始更新
    --方法1:1.3S
    merge into t_stat  s
    using t_ref  t
    on (t.b1 = s.b1)
    when matched then update set s.c1 = t.c2;
    ----验证
    select * from t_stat;
    --清空
    update t_stat set c1 = null;
    commit;
    ------------方法2 update  ----2.7s
    update t_stat a set a.c1=
     (
           select b.c2 from t_ref b  where a.b1=b.b1
     );
    
    
    
    select * from t_ref
  • 相关阅读:
    HDU 5091 Beam Cannon (扫描线思想)
    UVA12904 Load Balancing(中途相遇法)
    linux虚拟机时间同步
    linux shell
    项目bug
    定时发送邮件出现问题
    kafka里面的topic消费情况查看
    kafka常见命令
    HiJson简要说明
    zookeeper、hbase常见命令
  • 原文地址:https://www.cnblogs.com/adamgq/p/14306414.html
Copyright © 2011-2022 走看看