转自: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. Java模拟登录系统抓取内容【转载】

    没有看考勤的习惯,导致我的一天班白上了,都是钱啊,系统也不发个邮件通知下....     为了避免以后还有类似状况特别写了个java模拟登录抓取考勤内容的方法(部分代码来自网络),希望有人修改后也可以 ...

  2. Codeforces Gym 100286G Giant Screen 水题

    Problem G.Giant ScreenTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/con ...

  3. Codeforces Gym 100418B 暴力

    Sum of sequencesTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/v ...

  4. [ES6] 18. Map

    ES6 provides Map, it is a set of k-v pair. Key can be number, string, object, function and even unde ...

  5. MySQL · 物理备份 · Percona XtraBackup 备份原理

    http://mysql.taobao.org/monthly/2016/03/07/ 前言 Percona XtraBackup(简称PXB)是 Percona 公司开发的一个用于 MySQL 数据 ...

  6. Dijkstra最短路径算法[贪心]

    Dijkstra算法的标记和结构与prim算法的用法十分相似.它们两者都会从余下顶点的优先队列中选择下一个顶点来构造一颗扩展树.但千万不要把它们混淆了.它们解决的是不同的问题,因此,所操作的优先级也是 ...

  7. 关于struts2的modelDriven

    今天做毕业设计,前台往后台赋值,习惯性的用了modelDriven.但是刚写完就奇怪它的机理是怎样的,它怎么知道我前台传的参是哪个Model的属性(之前用servlet都是手动),于是手贱的ctrl点 ...

  8. 琐碎-关于StringTokenizer工具

    属于:java.util包 构造函数: 1. StringTokenizer(String str):构造一个用来解析str的StringTokenizer对象.java默认的分隔符是“空格”.“制表 ...

  9. CoreDate的使用

    勾选 xcode的 CoreDate会帮我们自动创建 CoreData 但是我们通常不那样使用,通常把 CoreDate 在单利类中创建, // // ZYDAO.h // StoryboardTes ...

  10. iOS的APP验证版本更新方法

    一个老项目没有集成自动检测及提示用户更新新版本的功能,自己在网上查资料捣鼓出自己的方法,可能比较粗陋,希望大家多多指导,我们的项目的版本号是X.X.X的格式,所以直接把字符串转换成float类型的值无 ...