Oracle实现一张表根据另一张表更新(有则更新无则插入)

如果在Oracle 有表value_dazong_index_mom_day(在table里存起来了),它所有字段值的更新依据表DZWWW_MOM(根据原始数据建立起的视图),这里假设这两张表的结构完全一样(事实上可以不一样,只需第一个表要更新的字段能匹配第二个表的字段,且两张表唯一索引对应即可,例如根据唯一id,对两张表其他字段进行匹配更新),其结构如下:

其中表DZWWW_MOM视图是依据原始数据进行计算的指标,并将计算好的指标按照该结构存到Tab中的表value_dazong_index_mom_day,原始数据每日更新,要求存到Tab表的指标也每日更新。

显然,DZWWW_MOM视图是依据原始数据计算的指标,它查询出的数据也是每日更新的,只需让Tab表依据该视图表更新即可,代码如下:

[sql] view plain copy

  1. merge into value_dazong_index_mom_day t1    
  2.   
  3. using DZWWW_MOM t2  
  4.   
  5. on(t1.日期=t2.日期)    
  6.   
  7. when matched then    
  8.   
  9. update set t1.大宗化工价格指数环比 = t2.大宗化工价格指数环比,  
  10.            t1.浮法玻璃价格指数环比 = t2.浮法玻璃价格指数环比,   
  11.            t1.水泥商品价格指数环比 = t2.大宗水泥价格指数环比,  
  12.            t1.大宗有色价格指数环比 = t2.大宗有色价格指数环比,  
  13.            t1.大宗钢铁价格指数环比 = t2.大宗钢铁价格指数环比  
  14. when not matched then  
  15.   
  16. insert (日期,大宗化工价格指数环比,浮法玻璃价格指数环比,水泥商品价格指数环比,大宗有色价格指数环比,大宗钢铁价格指数环比) VALUES(t2.日期,t2.大宗化工价格指数环比,t2.浮法玻璃价格指数环比,大宗水泥价格指数环比,t2.大宗有色价格指数环比,t2.大宗钢铁价格指数环比)   

学习依据: http://www.cnblogs.com/anzhao/p/5050555.html 

1)Oracle实现有则更新,无则插入

    使用MERGE INTO语句

    如下:已知传过来的参数三个 userid 、name 、sex.要求如果用户表(T_USER)中存在相同的userid则更新name和sex字段,如果用户表(T_USER)中不存在userid,则插入一条记录

    MERGE INTO T_USER T1 

    USING(SELECT userid AS id,name AS username,sex AS usersex FROM dual) T2

    ON(T1.userid=T2.id)

    WHEN MATCHED THEN

    update set t1.name=t2.username,t1.sex=t2.usersex

    WHEN NOT MATCHED THEN

    insert(userid,name,sex) VALUES(t2.id,t2.username,t2.usersex);

 

2)Mysql实现有则更新,无则插入

    MYSQL需要实现以上功能,需要怎么做呢?

    使用ON DUPLICATE KEY UPDATE语句

    已知传过来的参数三个 id 、username 、usersex 它们的值分别为: 1   张三  男.

 

    INSERT INTO T_USER(userid,name,sex) VALUES (id,username,usersex) ON DUPLICATE KEY UPDATE name=username,sex=usersex;

 

    注意:如果在Mysql中使用这种形式,则要求在数据表中userid字段必须是主键或建立了唯一的索引

 

 

merge into应用:实现 无则insert插入,有则update更新,一条语句直接进行insert/update操作

merge ino语法:

   MERGE INTO table1 alias1 
         USING (table2|view2|sub_query2) alias2
         ON (join condition) 
     WHEN MATCHED THEN 
         UPDATE table1 
               SET col1 = col_val1, 
                     col2  = col2_val 
     WHEN NOT MATCHED THEN 

               INSERT (column_list) VALUES (column_values); 

 

 

 
  1. --将总公司sstl的客户信息occ_file数据表和子公司sstl_dx的客户信息occ_file核对

  2. --如果sstl_dx公司的客户信息和sstl不同,则依据sstl客户信息更新sstl_dx的客户信息

  3. --如果sstl_dx公司没有,则将sstl的客户信息新增入sstl_dx公司

  4. MERGE INTO sstl_dx.occ_file dx_occ

  5. USING sstl.occ_file sstl_occ

  6. ON(dx_occ.occ01 = sstl_occ.occ01)

  7. WHEN MATCHED THEN

  8. update

  9. set dx_occ.occ02 = sstl_occ.occ02,

  10. dx_occ.occ03 = sstl_occ.occ03,

  11. dx_occ.occ04 = sstl_occ.occ04,

  12. dx_occ.occ05 = sstl_occ.occ05,

  13. ...

  14. where dx_occ.occacti = 'Y'

  15. WHEN NOT MATCHED THEN

  16. insert

  17. values(sstl_occ.occ01,sstl_occ.occ02,sstl_occ.occ03,sstl_occ.occ04,sstl_occ.occ05,...)

  18. where sstl_occ.occacti = 'Y';

本文转自:https://blog.csdn.net/qq_40285302/article/details/79722146

                   https://blog.csdn.net/lansetiankong12/article/details/78652335

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值