发布网友 发布时间:2024-10-24 17:23
共1个回答
热心网友 时间:3小时前
笔记总结了在工作中遇到过的几种update方法和各种方法适用的范围。
1. 单表更新方案:使用标准update语法即可,执行稳定且效率较高。格式为update table set (column1,column2,)=value1,value2,;,适用于单表更新。
2. 多表关联更新举例:例如,更新gkfq_rec表中所有slid与oa2_ftask表fi_inst相同的行,将blzt字段值更新为oa2_ftask表的ft_lstate。
方法描述、适用范围、运行效率:
具体实现方法如下:
update gkfq_rec aset blzt=(select b.ft_lstate from oa2_ftask b where a.slid=b.fi_inst)where exists(select 1 from oa2_ftask b where a.slid=b.fi_inst);
子查询返回多行值时,通过where exists条件逐行过滤,一一匹配实现set唯一值。
update (select a.blzt as blzt,b.ft_lstate as ft_lstatefrom gkfq_rec a,oa2_ftask b where a.slid=b.fi_inst)set blzt=ft_lstate;
要求B表的主键字段必须在where条件中,并且是以=号来关联被更新表,否则可能报错。
merge into gkfq_rec ausing oa2_ftask bon (a.slid=b.fi_inst)when matched thenupdate set a.blzt=b.ft_lstate;
在alias2中select出来的数据,每一条都跟alias1进行比较,若匹配,就进行更新操作,不匹配,执行插入操作。
beginfor aa in (select a.rowid as rowid,b.ft_lstate as ft_lstate from gkfq_rec a,oa2_ftask bwhere a.slid=b.fi_inst ) loopupdate gkfq_rec set blzt=aa.ft_lstatewhere rowid=aa.rowid;end loop;end;
配合oracle独有的内置ROWID物理字段,使用快速游标,不需要定义,直接把游标写到for循环中,快速定位并执行更新。
综上所述,针对不同的更新需求和场景,选择适合的方法可以提高更新效率和稳定性。在具体操作时,需根据实际数据和业务需求灵活选择。