问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

关于oracle数据库用update批量更新数据问题

发布网友 发布时间:2022-04-08 09:30

我来回答

2个回答

懂视网 时间:2022-04-08 13:51

说明:笔记总结了在工作中遇到过的几种update方法和各种方法适用的范围。

1.单表更新
方案:使用标准update语法即可,执行稳定且效率较高
update table
set (column1,column2,...)=
value1,value2,...
;

2.多表关联更新
举例:更新gkfq_rec表中所有slid与oa2_ftask表fi_inst相同的行,blzt字段值=oa2_ftask表的ft_lstate。

create table gkfq_rec (

slid char(12) parimary key,

blzt varchar2(50),

wjbt varchar2(100) not null,

........

);

create table oa2_ftask (

fi_inst char(12) parimary key,

fi_state int not null,

ft_lstate int not null,

...

);

 

 方法描述

 适用范围

 运行效率

 传统方案  一般情况适用  单表更新效率高且稳定,多表时效率较慢
 inline view更新法  关联字段为主键  速度较快
 merge更新法  关联字段非主键,适用于两表关联  非主键关联表更新,速度较快
 快速游标更新法  逻辑较复杂的情况  复杂逻辑时效率很高

 

(1)传统方案(速度可能最慢)
update gkfq_rec a 
set 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唯一值

(2)inline view更新法(关联主键字段,速度较快)
方案:更新一个临时建立的视图。要求B表的主键字段必须在where条件中,并且是以=号来关联被更新表,否则可能报错:ORA-01779:无法修改与非键值保存表对应的列。当B表主键字段为多列组合时,也有可能出现这一报错。update (select a.blzt as blzt,b.ft_lstate as ft_lstate
from gkfq_rec a,oa2_ftask b where a.slid=b.fi_inst) 
set blzt=ft_lstate
;

(3)merge更新法(关联字段非主键时,速度较快)
语法:
MERGE INTO table_name alias 1
USING (table|view|sub_query) alias 2
ON (join condition)
WHEN MATCHED THEN
UPDATE 
SET col1=col_val1,
    col2=col_val2
WHEN NOT MATCHED THEN
INSERT (column_list) VALUES (column_values);

方案:在alias2中select出来的数据,每一条都跟alias1进行ON (join condition)比较,若匹配,就进行更新操作,不匹配,执行插入操作。merge不会返回影响行数,且最多只能两表关联,适用于连接条件不是主键的字段。
merge into gkfq_rec a
using oa2_ftask b
on (a.slid=b.fi_inst)
when matched then
update set a.blzt=b.ft_lstate;

(4)快速游标更新法(复杂逻辑时,效率很高)
语法:
begin
for cr in (查询语句) loop  --循环
update table_name set ...   --更新语句(根据查询出来的结果集合)
end loop;  --结束循环
end;

方案:配合oracle独有的内置ROWID物理字段,使用快速游标,不需要定义,直接把游标写到for循环中,快速定位并执行更新。它可以支持复杂逻辑的查询语句,更新准确,无论数据多大更新效率依然很高。但执行后不返回影响行数。
begin
for aa in (select a.rowid as rowid,b.ft_lstate as ft_lstate from gkfq_rec a,oa2_ftask b
where a.slid=b.fi_inst ) loop
update gkfq_rec set blzt=aa.ft_lstate
where rowid=aa.rowid;
end loop;
end;

update更新多行数据(oracle)

标签:

热心网友 时间:2022-04-08 10:59

UPDATE TAB1
   SET TAB1.A =
       (SELECT TAB2.B FROM TAB2 WHERE TAB1.A = TAB2.A)
 WHERE TAB1.A IN (SELECT TAB2.A FROM TAB2);

追问表2里的主键是A和B,如果存在a1'b1,a1'b2的情况,那这个update就不行了

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
2198香辣虾是什么意思 虾什么梗 肖战 刻纸制作需要哪些步骤 好玩的生存游戏手游(好玩的生存游戏手游推荐) 北京电脑职业培训学校都有哪些北京电脑培训班都有哪些 欧盟商标注册需要提供什么资料? 怎么注册欧盟商标?需要准备哪些材料? 5g手机有什么好处 5g手机大概多少钱 口水臭是什么原因呢? 口水臭是什么原因 口水臭怎么改善 黑执事同人漫画浴室 求黑执事同人:《浴室》漫画 传说之下我屠杀线选了不出卖灵魂怎么办? 要是你出卖了,你的灵魂?? 摘录绝不出卖灵魂好句? 形容为了钱不能出卖灵魂的成语? 出卖灵魂犹如用鸡蛋撞石头 是什么意思? 《Dota2》双皇没有带领LGD夺冠,May皇准备直播道歉,对此你怎么看? 说钱很重要,什么工作都能做,但不能出卖灵魂 dota2dpc在哪直播 爱情需要出卖灵魂吗? dota2直播平台哪个是官方的 《绝不出卖灵魂》这本书讲了一个什么故事? dota2游戏主界面twitch直播怎么关,打游戏的时候拖网速,解说声音也关不 dota2解说紫色水离子现在为什么不直播了啊,最喜欢的一名解说了。是退出刀圈了吗? 什么叫做出卖灵魂 为什么现在dota2小主播的直播没有清晰度可以调 我要做这样的女人,不傍大款,不出卖灵魂,可以坚强、可以温柔、可以优雅、可以泼辣、可以可爱,重点是, 斗鱼dota2禁止直播吃鸡了么 出卖灵魂是什么意思? 黑执事同人漫画 浴室 跪求《黑执事》同人bl漫画,包含一本全彩的和浴室篇!!!请发至邮箱872681295@qq.com 跪求黑执事同人漫画浴室 黑执事同人的漫画,浴室加床上的,帮帮忙呗 求黑执事同人漫画浴室. 谁有黑执事同人漫画? 3A大作手游实测,黑鲨游戏手机2 Pro评测 黑鲨游戏手机2 Pro和iPhoneXs哪个好? 黑鲨游戏手机2 Pro和荣耀20哪个好? 黑鲨游戏手机2 Pro和魅族16Xs哪个好? class是python保留字吗 微博图片怎么水印 python的保留字 这种“淘宝店和微信微博”的水印怎么加?最好是有手机就可以操作的。 如何用Python判断一个标识符word是不是保留字? 整式的混合运算 整式混合运算怎么里怎么合并同类项。。。! 整式的结合律,分配律,交换律,怎样理解,记住,是整式,有代数的那一种,里面的运算符号是什么规律请详 整式加减、整式的乘法、乘法公式、整式的除法、因式分解的公式 50题整式混合运算答案及过程是什么?