当前位置:操作系统 > Unix/Linux >>

表A修改表B数据功能实现

表A修改表B数据功能实现
 
 今天因为原来项目方法的问题导致计算数据错误,现在需要将以前的数据更改回来,需要更改的表如下:
 
表A (学员培训信息表)
 
[sql] 
stus_id           INTEGER not null,  
stu_idcard        VARCHAR2(50) not null,  
mas_idcard        VARCHAR2(30),  
stus_starttime    DATE not null,  
stus_endtime      DATE,  
stus_totalminute  INTEGER,  
stus_totalmileage INTEGER,  
stus_sinfoid      INTEGER not null,  
stus_checktype    VARCHAR2(50),  
stus_isok         VARCHAR2(30) default 1,  
stus_carid        INTEGER,  
stus_deviceid     VARCHAR2(50) not null,  
ds_id             INTEGER,  
consumetypeid     INTEGER default 0 not null,  
createdate        DATE,  
sumofconsumption  NUMBER(18,2),  
createby          INTEGER,  
stus_isnormal     INTEGER default 1,  
stus_errorcausa   VARCHAR2(100),  
region_ratio      NUMBER default 0 not null,  
region_min_ratio  NUMBER default 0 not null,  
options           VARCHAR2(200),  
stus_ispass       INTEGER default 1,  
stus_remark       VARCHAR2(1000),  
regionids         VARCHAR2(1000)  
表 B(学员学时表)
[sql] 
stut_id            INTEGER not null,  
stu_idcard         VARCHAR2(30) not null,  
stut_sinfoid       INTEGER not null,  
stut_totalperiod   INTEGER not null,  
stut_lasttime      DATE not null,  
stut_totalmileage  INTEGER not null,  
error_totalperiod  INTEGER default 0 not null,  
error_totalmileage INTEGER default 0 not null,  
stut_nums          INTEGER default 0 not null  
要根据表A中的身份证(stu_idcard)、项目编号(stus_sinfoid)来进行累加stus_totalmileage得到结果更改表B对应列值中的stut_totalmileage
 
首先查询所要修改的表A数据:
 
[sql] 
select  a.stu_idcard,a.stus_sinfoid,sum(a.stus_totalmileage)  from a group by a. stu_idcard,a.stus_sinfoid order by stu_idcard  
根据上面得出的数据更改表B 的stut_totalmileage
 
起先在百度里面找到一些方法,但都无法进行实际的转换,最后看到 merge into函数
 
这个函数只能在9i及以上的版本使用。
 
说明:
 
在进行SQL语句编写时,我们经常会遇到大量的同时进行Insert/Update的语句 ,也就是说当存在记录时,就更新(Update),不存在数据时,就插入(Insert)。
语法:
 
[sql] 
MERGE INTO table_name alias1   
USING (table|view|sub_query) alias2  
ON (join condition)   
WHEN MATCHED THEN   
    UPDATE table_name   
    SET col1 = col_val1,   
        col2     = col2_val   
WHEN NOT MATCHED THEN   
    INSERT (column_list) VALUES (column_values)  
    [WHERE col1...];   
按照上面的语法逻辑就可得出下面SQL语句:
 
[sql] 
merge into t_ds_stutime me   
using   
(select * from (select ec.stu_idcard,ec.stus_sinfoid,sum(ec.stus_totalmileage) cc   
from t_ds_stagerec ec group by ec.stu_idcard,ec.stus_sinfoid order by ec.stu_idcard)) kk  
on(me.stu_idcard=kk.stu_idcard and me.stut_sinfoid=kk.stus_sinfoid )  
when matched then  
  update set me.stut_totalmileage=kk.cc  
where me.stut_totalmileage!=kk.cc  
 
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,