在合适的情况下选择多行Update方式

笔记主题:update更新多行数据(oracle)

更新日期:2013-07-25

说明:笔记总结了在工作中遇到过的几种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;

时间: 2024-10-10 09:52:13

在合适的情况下选择多行Update方式的相关文章

memcached分布测试(一致性哈希情况下的散列函数选择)

   memcached本身是集中式的缓存系统,要搞多节点分布,只能通过客户端实现.memcached的分布算法一般有两种选择: 1.根据hash(key)的结果,模连接数的余数决定存储到哪个节点,也就是hash(key)% sessions.size(),这个算法简单快速,表现良好.然而这个算法有个缺点,就是在memcached节点增加或者删除的时候,原有的缓存数据将大规模失效,命中率大受影响,如果节点数多,缓存数据多,重建缓存的代价太高,因此有了第二个算法. 2.Consistent Has

jQuery针对input的class属性写了多个值情况下的选择方法_jquery

本文实例讲述了jQuery针对input的class属性写了多个值情况下的选择方法.分享给大家供大家参考,具体如下: jQuery选择input的class属性写了多个值的情况: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <script src="jquery-1.6.2.js" ty

Sql Server优化之索引提示----我们为什么需要查询提示,Sql Server默认情况下优化策略选择的不足

原文:Sql Server优化之索引提示----我们为什么需要查询提示,Sql Server默认情况下优化策略选择的不足 环境: Sql Server2012 SP3企业版,Windows Server2008 标准版   问题由来: 最近在做DB优化的时候,发现一个存储过程有非常严重的性能问题, 由于整个SP整体逻辑是一个多表关联的复杂的查询,整体结构比较复杂的,通过的分析和尝试, 最后发现问题出在其中一个大表的查询上实现方式上, 因为这个大表上的意外的执行方式,导致其他表无法被驱动,其他表也

关于何种情况下使用DataGrid、DataList或Repeater的一些讨论

datagrid [概述] WEB开发自从有了基于脚本的WEB编程技术(如ASP)以来,经历了一个漫长的过程.通过使用微软的ASP.Net技术,传统的ASP中大量的.单调乏味的.重复性的编程工作成为了历史.例如,象大多数ASP程序员所知的,在ASP中显示数据库内容所需要的过程: 建立数据库连接 用SQL查询装载ADO数据集 显示所需要的任何HTML代码 遍历数据集中的记录 输出记录字段值及相关的HTML 移向下一条记录 循环 显示所需要的HTML代码 又如,为了在表格中显示记录集的内容,我们需要

vmware虚拟机关机的情况下怎么把文件复制到虚拟机里?

  现在有很多种方法把文件复制到虚拟机里面去,比如vmware,一种是安装vmware tools工具包,还有就是把实体机分区挂载在虚拟机里面.如果虚拟机里面没有系统或者虚拟机没有开机,该怎么弄呢.这里我们只需要一个小工具diskgenius就行了. 1.首先在虚拟机关机的情况下,我们打开小工具diskgenius,点击硬盘-打开虚拟硬盘文件-然后找到当初放虚拟机的位置,找到后缀名为.vmdk的文件-打开 2.左边的VD0:Windows XP Profession就是打开的虚拟机硬盘,如图所示

在什么情况下会用到第三方的控件,为什么不自己开发呢?

问题描述 在什么情况下会用到第三方的控件,为什么不自己开发呢? 一般在什么情况下会选择去用第三方的控件,为什么程序员不自己去写呢? 解决方案 我在VB6.0想用Win7风格的按钮,我写了600多行(不是load image)然后各种事件像Mouse_Move,Mouse_Drag,还有Click--最后写完脑子都大了所以一般情况下有第三方de大部分情况都选第三方 解决方案二: 我在VB6.0想用Win7风格的按钮,我写了600多行(不是load image)然后各种事件像Mouse_Move,M

只有在能保证服务质量的情况下才进行服务的扩张

摘要: 他们准备的文章既讲故事,又向创业者提供可操作的建议,以助力打造优秀的公司.对于很多初创公司而言,如何拓展自己的服务都是一个不小的问题.在将服务拓展到一个新的城市时 他们准备的文章既讲故事,又向创业者提供可操作的建议,以助力打造优秀的公司.对于很多初创公司而言,如何拓展自己的服务都是一个不小的问题.在将服务拓展到一个新的城市时,是重头来过,还是复制模式?Homejoy成功的服务拓展经验或许能带给你一点启发. 两年前,Aaron和Adora Cheung(下图)推出了钟点工服务Homejoy

服务器上的Mysql表全丢了情况下恢复数据

任务: web项目是在linux的Tomcat部署,Mysql也在上面,不知明原因下数据库宕机,启动不了,数据库表也突然没了,全空了!!!!!!!! mysql安装目录 惊喜的发现var/目录下有类似丢失数据库的表 接下来就是怎么恢复进去了,首先我们用的是mysql的InnoDb引擎,找了下其资料: 两种类型最主要的差别就是Innodb 支持事务处理与外键和行级锁.而MyISAM不支持.所以MyISAM往往就容易被人认为只适合在小项目中使用. 我作为使用MySQL的用户角度出发,Innodb和M

wpf RichTextBox GetLineStartPosition 在某种情况下不能识别换行?

问题描述 TextPointertp1=rtb.Selection.Start.GetLineStartPosition(1);这样可以选中我选择行的下一行的TextPointer,ok,没问题.但是:TextPointert1=rtb.Document.ContentStart.GetLineStartPosition(1);我这样使用,却不能取到下一行的TextPointer.他会引发一个异常,后来发现,这种情况下,所有的内容(不管你有几行)都会被当做一个只有一行的超长字符串(其中包括换行符