表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