Oracle批量、大量Update方法总结
一、业务场景:
(1)主从两个表,主表Student,有字段id、name、sex,从表Boy,有字段id、name,主从表同一对象id相同
(2)从表Boy的name属性被业务修改,定时批量处理主表,以维持主表name属性与从表一致
二、表结构
1、主表 Student
2、从表 Boy
三、建表SQL(DDL)
1、主表 Student
-- DDL
CREATE TABLE student (
id NUMBER NOT NULL ,
name VARCHAR2( BYTE) NULL ,
sex VARCHAR2( BYTE) NULL
) ALTER TABLE student ADD CHECK (id IS NOT NULL); -- DML
INSERT INTO student VALUES ('', 'zhangsan', 'boy');
INSERT INTO student VALUES ('', 'lisi', 'girl');
INSERT INTO student VALUES ('', 'wangwu', 'boy');
2、从表 Boy
-- DDL
CREATE TABLE boy (
id NUMBER NOT NULL ,
name VARCHAR2( BYTE) NULL
) -- DML
INSERT INTO boy VALUES ('', '张三');
INSERT INTO boy VALUES ('', '王五');
四、DML
1、基本语法
-- DML
UPDATE student s SET s.name = '张三' WHERE id = ;
2、变相
-- DML,.015s
UPDATE student s
SET s.name = (
SELECT b.name FROM boy b WHERE s.id = b.id AND s.name != b.name
)
WHERE EXISTS (
SELECT FROM boy b WHERE s.id = b.id AND s.name != b.name
);
3、快速游标法
-- DML,.014s
BEGIN
FOR cur IN (
SELECT s.id sid, b.name bname
FROM student s, boy b
WHERE s.id = b.id AND s.name != b.name AND s.sex = 'boy'
) loop UPDATE student s SET s.name = cur.bname WHERE s.id = cur.sid; END loop ;
END ;
4、内联视图法(inline View)
-- DML,.019s
UPDATE (
SELECT
s.name sname, b.name bname
FROM
student s, boy b
WHERE
s.id = b.id AND s.name != b.name
)
SET sname = bname;
报错提示:ORA-01779: 无法修改与非键值保存表对应的列
参考资料,从表id必须增加主键约束,且为视图内的where条件:
-- DDL
ALTER TABLE boy ADD CONSTRAINT pk_id PRIMARY KEY (id);
5、合并法(Merge)
MERGE INTO student s USING boy b ON (
s.id = b.id AND s.sex = 'boy' AND s.name != b.name
)
WHEN MATCHED THEN
UPDATE SET s.name = b.name;
报错提示:ORA-38104: 无法更新 ON 子句中引用的列
参考资料,错误原因是条件重复,正确写法:
-- DML,.016s
MERGE INTO student s USING boy b ON (
s.id = b.id AND s.sex = 'boy'
-- AND s.name != b.name
)
WHEN MATCHED THEN
UPDATE SET s.name = b.name;
6、子查询关联
update service cs set (cs.customer_id,cs.customer_code,cs.customer_name)=
(
select ccb.customer_id,ccb.customer_code,ccb.customer_name from customer_base ccb
inner join customer_contact ccc
on ccb.customer_id=ccc.customer_id
where ccc.key_='' and ccc.value_=cs.value_ and rownum<
)
where customer_id='' and start_time>sysdate-
Oracle批量、大量Update方法总结的更多相关文章
- oracle 批量更新之update case when then
oracle 批量更新之update case when then CreationTime--2018年8月7日15点51分 Author:Marydon 1.情景描述 根据表中同一字段不同情况 ...
- Oracle中的 UPDATE FROM 解决方法
转:http://www.cnblogs.com/JasonLiao/archive/2009/12/23/1630895.html Oracle中的 UPDATE FROM 解决方法 在表的更新操作 ...
- MySql中4种批量更新的方法update table2,table1,批量更新用insert into ...on duplicate key update, 慎用replace into.
mysql 批量更新记录 MySql中4种批量更新的方法最近在完成MySql项目集成的情况下,需要增加批量更新的功能,根据网上的资料整理了一下,很好用,都测试过,可以直接使用. mysql 批量更新共 ...
- oracle Plsql 运行update或者delete时卡死问题解决的方法
oracle Plsql 运行update或者delete时 遇到过Plsql卡死问题或者导致代码运行sql的时候就卡死. 在开发中遇到此问题的时候,本来把sql复制出来,在plsql中运行,Sql本 ...
- mybatis执行批量更新update
Mybatis的批量插入这里有http://ljhzzyx.blog.163.com/blog/static/38380312201353536375/.目前想批量更新,如果update的值是相同的话 ...
- C# Oracle批量插入数据进度条制作
前言 由于项目需求,需要将Excel中的数据进过一定转换导入仅Oracle数据库中.考虑到当Excel数据量较大时,循环Insert语句效率太低,故采用批量插入的方法.在插入操作运行时,会造成系统短暂 ...
- oracle批量新增更新数据
本博客介绍一下Oracle批量新增数据和更新数据的sql写法,业务场景是这样的,往一张关联表里批量新增更新数据,然后,下面介绍一下批量新增和更新的写法: 批量新增数据 对于批量新增数据,介绍两种方法 ...
- Oracle索引梳理系列(一)- Oracle访问数据的方法
版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...
- mybatis批量更新 UPDATE mysql
oracle和mysql数据库的批量update在mybatis中配置不太一样: oracle数据库: <update id="batchUpdate" parameterT ...
- [原创]java WEB学习笔记79:Hibernate学习之路--- 四种对象的状态,session核心方法:save()方法,persist()方法,get() 和 load() 方法,update()方法,saveOrUpdate() 方法,merge() 方法,delete() 方法,evict(),hibernate 调用存储过程,hibernate 与 触发器协同工作
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
随机推荐
- 配置WDA程序到NWBC
NWBC是通过角色来做的权限管理,包括菜单项. 如果用户没有分配对应的,登陆后看到的东西很少,或者空白. 这里需要先将BC的个性化参数全部配齐,方便使用.BC最左上角,点击,设置,个性化设置. 如下几 ...
- Django框架(七)-- 模板层:模板导入、模板继承、静态文件
一.模板导入 要复用一个组件,可以将该组件写在一个文件中,在使用的时候导入即可 在模板中使用 1.语法 {% include '模板名字' %} 2.使用 ad.html页面 <div clas ...
- dos2unix的使用
由于在DOS(windows系统)下,文本文件的换行符为CRLF,而在Linux下换行符为LF,使用git进行代码管理时,git会自动进行CRLF和LF之间的转换,这个我们不用操心.而有时候,我们需要 ...
- linux的性能调优
单机调优: 分析性能瓶颈的原因,解决它. cpu子系统 内存子系统 IO子系统 网络系统 @cpu子系统调优 cpu技术指标 xeon E5520 2.27GHz 8192kb # c ...
- Java的transient关键字
Java的transient关键字 Java 中的 transient 关键字被用来表示变量将不被序列化处理.那么在理解 transient 关键字之前,我们先了解下什么是序列化. 什么是序列化 ...
- python参数传递
1.形式参数:在定义函数时,函数名后面括号中的参数为“形式参数”,也称形参 2.实际参数:在调用一个函数时,函数名后面括号种的参数为“实际参数”,也就是将函数的调用者提供给函数的参数称为实际参数,也称 ...
- 重新学习Spring注解——扩展原理
39.扩展原理-BeanFactoryPostProcessor 40.扩展原理-BeanDefinitionRegistryPostProcessor 41.扩展原理-ApplicationList ...
- ManiFest.MF
Manifest-Version: 1.0 //指定manifest文件的版本信息 Bundle-ManifestVersion: 2 //指定该包遵从 OSGi 规范 V3 或者 OSGi 规范 V ...
- [BZOJ2667][cqoi2012][kcoj]模拟工厂
题目描述 Description 有一个称为“模拟工厂”的游戏是这样的:在时刻0,工厂的生产力等于1.在每个时刻,你可以提高生产力或者生产商品.如果选择提高生产力,在下一个时刻时工厂的生产力加1:如果 ...
- 写一个function,清除字符串前后的空格(兼容所有的浏览器)
function trim1(str){ return str.replace(/(^\s*)|(\s*$)/g,""); }