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 与 触发器协同工作
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
随机推荐
- 【软件工程第二次作业】个人项目:WordCountPy
一.GitHub 地址 项目 GitHub 地址为:https://github.com/bytemo/WordCountTool 二.PSP表格 PSP2.1 Personal Software P ...
- java mybatis Column 'AAA' in where clause is ambiguous
今天在java mybatis项目中遇到一个问题,“java mybatis Column 'AAA' in where clause is ambiguous”, 这是由于在多表连接查询的时候,遇上 ...
- Django中ModelViewSet的应用
ModelViewSet源码 class ModelViewSet(mixins.CreateModelMixin, mixins.RetrieveModelMixin, mixins.UpdateM ...
- WTL 9.0的变化 - atlctrls.h
atlctrls.h中是对控件的封装. 第1249行增加: void GetMargins(UINT& nLeft, UINT& nRight) const { ATLASSERT(: ...
- C#进程间通讯或同步的框架引荐
这篇文章主要介绍了一个进程间通讯同步的C#框架,代码具有相当的稳定性和可维护性,随着.NET的开源也会被注入更多活力,推荐!需要的朋友可以参考下 0.背景简介 微软在 .NET 框架中提供了多种实用 ...
- JDK1.8 LocalDate 使用方式;LocalDate 封装Util,LocalDate工具类(四)
未完待续 ........ 前言: 加班了好几天,终于结束上一个坑的项目了,项目交接人员全部离职,代码一行注释没有,无人问津的情况下,完成了项目,所以好的规范真的很重要. 继续日期改写 一 ...
- C#中Equals 与== 的区别
这个问题听说是大公司面试都会问的问题,以前不怎么了解,好奇心勾引我来研究一下 首先从值类型分析,先写几句简单的代码供测试用,二行语句输出的都是true, 说明==与Equals功能是相同的, 判断的都 ...
- linux/ubuntu 取色工具gpick
命令行方式安装: sudo apt-get install gpick 安装完成以后,在终端窗口中输入: gpick 即可以启动工具
- nginx proxy_pass 指令
nginx proxy_pass 指令 文档 Nginx 官方文档 https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pa ...
- input 关键字提示,对于一些特定优化来说,很有用处
只用html就可以做出提醒操作:效果如下图 这里是代码,怎么样,很简单吧 <form action="/server" method="post"> ...