平平无奇的工作中,突然有个需求要我进行批量修改的操作,而且是根据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

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐