转自:http://blog.itpub.net/25322446/viewspace-767505

说明:笔记总结了在工作中遇到过的几种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)的更多相关文章

  1. mysql update改动多条数据

    通常情况下,我们会使用下面SQL语句来更新字段值: 复制代码代码例如以下: UPDATE mytable SET myfield='value' WHERE other_field='other_va ...

  2. MySQL插入,更新,删除数据

    插入 单行插入 1.insert into 表名 values(col1_value,col2_value,...); 每个列必须提供一个值,如果没有值,要提供NULL值 每个列必须与它在表中定义的次 ...

  3. oracle使用 merge 更新或插入数据

    OracleCC++C#  总结下.使用merge比传统的先判断再选择插入或更新快很多. 1)主要功能 提供有条件地更新和插入数据到数据库表中 如果该行存在,执行一个UPDATE操作,如果是一个新行, ...

  4. 在oracle中使用merge into实现更新和插入数据

    目录 oracle中使用merge into DUAL表解释 使用场景 用法 单表 多表 oracle中使用merge into DUAL表解释 在Oracle数据库中,dual是Oracle中的一个 ...

  5. SQL语句的使用,SELECT - 从数据库表中获取数据 UPDATE - 更新数据库表中的数据 DELETE - 从数据库表中删除数据 INSERT INTO - 向数据库表中插入数据

    SQL DML 和 DDL 可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL). SQL (结构化查询语言)是用于执行查询的语法. 但是 SQL 语言也包含用于更新. ...

  6. 在UPDATE中更新TOP条数据以及UPDATE更新中使用ORDER BY

    正常查询语句中TOP的运用: SELECT TOP 1000 * FROM MP_MemberGrade   随意更新一张表中满足条件的前N条数据: UPDATE TOP (1) MP_Member ...

  7. Oracle一列的多行数据拼成一行显示字符

    Oracle一列的多行数据拼成一行显示字符   oracle 提供了两个函数WMSYS.WM_CONCAT 和 ListAgg函数.    www.2cto.com   先介绍:WMSYS.WM_CO ...

  8. ASP.NET网页动态添加、更新或删除数据行

    ASP.NET网页动态添加.更新或删除数据行 看过此篇<ASP.NET网页动态添加数据行> http://www.cnblogs.com/insus/p/3247935.html的网友,也 ...

  9. SQL Server下ADO.NET 怎么获取数据库SQL语句INSERT,UPDATE,DELETE了多少行数据

    ADO.NET 在发送SQL语句到SQL Server数据库后,怎么知道真正INSERT,UPDATE,DELETE了多少行数据呢? 使用SQL Server内置的全局变量@@ROWCOUNT即可,@ ...

随机推荐

  1. 【转】Rails 3.1错误-Could not find a JavaScript runtime及execjs和therubyracer介绍

    转自:http://rubyer.me/blog/740/ Rails 3.1错误 /gems/execjs-1.1.2/lib/ execjs/runtimes.rb:43:in `autodete ...

  2. 自己写一个jQuery垂直滚动栏插件(panel)

    html中原生的滚动栏比較难看,所以有些站点,会自己实现滚动栏,导航站点hao123在一个側栏中,就自己定义了垂直滚动栏,效果比較好看,截图例如以下: watermark/2/text/aHR0cDo ...

  3. UVALive 7070 The E-pang Palace 暴力

    The E-pang Palace Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/problem ...

  4. 深度学习论文笔记-Deep Learning Face Representation from Predicting 10,000 Classes

    来自:CVPR 2014   作者:Yi Sun ,Xiaogang Wang,Xiaoao Tang 题目:Deep Learning Face Representation from Predic ...

  5. 关于IE8中使用Jquery load方法无法正常加载页面

    最近发现,在IE8中使用Jquery load方法时无法正常加载页面,页面显示空白,没有加载.调试发现,页面多了一个</div>标签,但在FF和CH下表现正常.希望能给遇到同样问题的码农有 ...

  6. Swift 3.0 使用Core Data

    swift版本:3.0 Xcode版本:8.0 iOS版本:10.0 自iOS10 和swift3.0 之后,苹果的访问CoreData的方法发生了很大改变,简洁了许多,下面的内容是从0开始建立一个e ...

  7. PhoneGap开发手机程序入门教程

    用PhoneGap开发手机移动程序 1.     什么是PhoneGap PhoneGap是一个自由开放源码的开发工具和框架,允许利用HTML + JavaScript + CSS的强大功能在多个手机 ...

  8. C++中的inline函数

    内联函数: () 内联函数定义和作用: 将一个函数声明为inline,那么函数就成为内联函数.内联函数通常就是它在程序中每个调用点上“内联地”展开.从定义上看,内联函数跟一般函数不一样,一般函数调用的 ...

  9. pt-online-schema-change原理解析 博客相关需要阅读

    xiaoboluo768  http://www.lai18.com/user/481193.html   都说pt-toolkit工具集中的pt-online-schema-change可以在线不锁 ...

  10. android开发之路07(无硝烟的战争)

    如何做一名优秀的android面试官? 如何做一名优秀的android候选者? 提到这个问题我不得不提起我们小升初,初升高,高生升本这几个历程中我们与出题人之间的无硝烟的战争.我们总是为自己的成绩担心 ...