一、业务场景:

(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方法总结的更多相关文章

  1. oracle 批量更新之update case when then

      oracle 批量更新之update case when then CreationTime--2018年8月7日15点51分 Author:Marydon 1.情景描述 根据表中同一字段不同情况 ...

  2. Oracle中的 UPDATE FROM 解决方法

    转:http://www.cnblogs.com/JasonLiao/archive/2009/12/23/1630895.html Oracle中的 UPDATE FROM 解决方法 在表的更新操作 ...

  3. MySql中4种批量更新的方法update table2,table1,批量更新用insert into ...on duplicate key update, 慎用replace into.

    mysql 批量更新记录 MySql中4种批量更新的方法最近在完成MySql项目集成的情况下,需要增加批量更新的功能,根据网上的资料整理了一下,很好用,都测试过,可以直接使用. mysql 批量更新共 ...

  4. oracle Plsql 运行update或者delete时卡死问题解决的方法

    oracle Plsql 运行update或者delete时 遇到过Plsql卡死问题或者导致代码运行sql的时候就卡死. 在开发中遇到此问题的时候,本来把sql复制出来,在plsql中运行,Sql本 ...

  5. mybatis执行批量更新update

    Mybatis的批量插入这里有http://ljhzzyx.blog.163.com/blog/static/38380312201353536375/.目前想批量更新,如果update的值是相同的话 ...

  6. C# Oracle批量插入数据进度条制作

    前言 由于项目需求,需要将Excel中的数据进过一定转换导入仅Oracle数据库中.考虑到当Excel数据量较大时,循环Insert语句效率太低,故采用批量插入的方法.在插入操作运行时,会造成系统短暂 ...

  7. oracle批量新增更新数据

    本博客介绍一下Oracle批量新增数据和更新数据的sql写法,业务场景是这样的,往一张关联表里批量新增更新数据,然后,下面介绍一下批量新增和更新的写法: 批量新增数据 对于批量新增数据,介绍两种方法 ...

  8. Oracle索引梳理系列(一)- Oracle访问数据的方法

    版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...

  9. mybatis批量更新 UPDATE mysql

    oracle和mysql数据库的批量update在mybatis中配置不太一样: oracle数据库: <update id="batchUpdate" parameterT ...

  10. [原创]java WEB学习笔记79:Hibernate学习之路--- 四种对象的状态,session核心方法:save()方法,persist()方法,get() 和 load() 方法,update()方法,saveOrUpdate() 方法,merge() 方法,delete() 方法,evict(),hibernate 调用存储过程,hibernate 与 触发器协同工作

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

随机推荐

  1. 配置WDA程序到NWBC

    NWBC是通过角色来做的权限管理,包括菜单项. 如果用户没有分配对应的,登陆后看到的东西很少,或者空白. 这里需要先将BC的个性化参数全部配齐,方便使用.BC最左上角,点击,设置,个性化设置. 如下几 ...

  2. Django框架(七)-- 模板层:模板导入、模板继承、静态文件

    一.模板导入 要复用一个组件,可以将该组件写在一个文件中,在使用的时候导入即可 在模板中使用 1.语法 {% include '模板名字' %} 2.使用 ad.html页面 <div clas ...

  3. dos2unix的使用

    由于在DOS(windows系统)下,文本文件的换行符为CRLF,而在Linux下换行符为LF,使用git进行代码管理时,git会自动进行CRLF和LF之间的转换,这个我们不用操心.而有时候,我们需要 ...

  4. linux的性能调优

    单机调优: 分析性能瓶颈的原因,解决它.   cpu子系统 内存子系统 IO子系统 网络系统       @cpu子系统调优 cpu技术指标 xeon E5520 2.27GHz 8192kb # c ...

  5. Java的transient关键字

    Java的transient关键字   Java 中的 transient 关键字被用来表示变量将不被序列化处理.那么在理解 transient 关键字之前,我们先了解下什么是序列化. 什么是序列化 ...

  6. python参数传递

    1.形式参数:在定义函数时,函数名后面括号中的参数为“形式参数”,也称形参 2.实际参数:在调用一个函数时,函数名后面括号种的参数为“实际参数”,也就是将函数的调用者提供给函数的参数称为实际参数,也称 ...

  7. 重新学习Spring注解——扩展原理

    39.扩展原理-BeanFactoryPostProcessor 40.扩展原理-BeanDefinitionRegistryPostProcessor 41.扩展原理-ApplicationList ...

  8. ManiFest.MF

    Manifest-Version: 1.0 //指定manifest文件的版本信息 Bundle-ManifestVersion: 2 //指定该包遵从 OSGi 规范 V3 或者 OSGi 规范 V ...

  9. [BZOJ2667][cqoi2012][kcoj]模拟工厂

    题目描述 Description 有一个称为“模拟工厂”的游戏是这样的:在时刻0,工厂的生产力等于1.在每个时刻,你可以提高生产力或者生产商品.如果选择提高生产力,在下一个时刻时工厂的生产力加1:如果 ...

  10. 写一个function,清除字符串前后的空格(兼容所有的浏览器)

    function trim1(str){ return str.replace(/(^\s*)|(\s*$)/g,""); }