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

     今天因为原来项目方法的问题导致计算数据错误,现在需要将以前的数据更改回来,需要更改的表如下:

表A (学员培训信息表)

  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(学员学时表)

  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数据:

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)。

语法:

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语句:

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







你可能感兴趣的:(Oracle,一个程序员的成长历程)