Oracle 根据select查询数据进行批量修改
批量修改
·
平平无奇的工作中,突然有个需求要我进行批量修改的操作,而且是根据select的查询结果进行插入。
正常情况下,我的思路是先用select查出来,然后在代码中遍历结果集进行一个个update。
这样的方式让我觉得很不舒服,如果数据量大的话需要大量访问数据库,然后修改数据
然后思考,有批量插入,那么批量修改也应该存在,然后度娘就派上用场了,根据关键字的不断变化,最后我还是得到了想要的东西。
比如:
案例1:员工表有个当月工资的字段,每个月发工资的时候需要自动修改员工的当月工资,而当月工资是在工资表里面(所有发放的工资都记录在里面)----自己造的需求
update t_emp emp set emp.sal = (
select s.sal from t_sal s
where s.emp_id = emp.id
and s.sal_date = (select max(sal_date) from t_sal)
)
where emp.id = (
select s.emp_id from t_sal s
where s.emp_id = emp.id
and s.sal_date = (select max(sal_date) from t_sal)
)
案例2:需要在数字连续的排序字段的中间插入一列数据,为了保证后面的排序顺序就需要+1(sql表示为在排序序号为9的位置插入)
update DICT a set a.SHOW_ORDER = (
select b.SHOW_ORDER + 1 from DICT b where b.SHOW_ORDER = a.SHOW_ORDER
)
where a.SHOW_ORDER = (
select c.SHOW_ORDER from DICT c where c.SHOW_ORDER >= 9 and c.SHOW_ORDER = a.SHOW_ORDER
);
insert into DICT (id, DICT_NAME, SHOW_ORDER)
values (DICT.nextval, 'DICT', 9);
如有不对,欢迎大佬们指正
----------------------------------------------------------------------------------------------------------------------------
最近又来了个批量修改多个字段的值,按原来的方法太臃肿了,老大叫我用merge into,发现果然好用,之前一直以为merge into是用来做根据条件判断要新增还是修改这类sql,没注意还有批量修改的妙用。
比如上面案例1的内容可以这样改造:
merge into t_emp emp
using (
select s.sal,s.emp_id from t_sal s
where s.sal_date = (select max(sal_date) from t_sal)
) s
on (emp.id = s.emp_id)
when matched then
update
set emp.sal = s.sal,后面可以跟多个值修改,用逗号隔开
这样一对比,真香,只不过这样需要多了解一下merge into
更多推荐
已为社区贡献2条内容
所有评论(0)