oracleupdateexsits,Oracle⼏种update语句分析
1.单条语句更新
语法:UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
说明:如果更新的字段加了索引,更新时会重建索引,更新效率会慢。单表更新或较简单的语句采⽤使⽤此⽅案更优。
2.批量数据更新
语法:update 表a set a.字段1 = (select b.字段1 from 表b where a.字段2=b.字段2) where exists(select 1 from 表b where a.字段2=b.字段2)
说明:查表a的所有数据,循环每条数据,验证该条数据是否符合exists(select 1 from 表b where a.字段2=b.字段2)条件,如果是则执⾏(select b.字段1 from 表b where a.字段2=b.字段2)查询,查到对应的值更新a.字段1中。关联表更新时⼀定要有exists(select 1 from 表b where a.字段2=b.字段2)这样的条件,否则将表a的其他数据的字段1更新为null值。
<更新法
语法:merge是oracle特有的语句,语法如下:
MERGE INTO table_name t1
USING (table|view|sub_query) t2
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);
说明:在t2中Select出来的数据,每⼀条都跟t1进⾏ ON (join condition)的⽐较,如果匹配,就进⾏更
新的操作(Update),如果不匹配,就进⾏插⼊操作(Insert)。执⾏merge不会返回影响的⾏数。Merge语句的写法⽐较繁琐,并且最多只能两个表关联,复杂的语句⽤merge更新将⼒不从⼼且效率差。两表关联且被更新表不是通过关联表主键关联的,采⽤此⽅案更优。
4.利⽤存储过程中游标更新
语法:
begin
for cur in (查询语句) loop –-循环
oracle游标的使用--更新语句(根据查询出来的结果集合)
end loop; --结束循环
end;
说明:oracle⽀持快速游标,不需要定义直接把游标写到for循环中,这样就⽅便了我们批量更新数据。再加上oracle的rowid物理字段(oracle默认给每个表都有rowid这个字段,并且是唯⼀索引),可以
快速定位到要更新的记录上。使⽤快速游标的好处很多,可以⽀持复杂的查询语句,更新准确,⽆论数据多⼤更新效率仍然⾼,但执⾏后不返回影响⾏数。
多表关联且逻辑复杂的,采⽤此⽅案更优。
上⼀篇:Oracle执⾏时报错代码及信息
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论