oracle 批量更新之将一个表的数据批量更新至另一个表

CreationTime--2018年7月3日17点38分

Author:Marydon

Oracle 将一个表的指定字段的值更新至另一个表的对应字段

案例一:

1.情景描述

  testdata表数据展示

  testdata2表数据展示

  数据对比:

  testdata表有31条数据,且有9条数据的userid与testdata2表不一致(自己独有);

  testdata2表有24条数据,且有2条数据的userid与testdata2表不一致(自己独有)。

  表关联:testdata表和testdata2表的userid具有关联关系

  需求说明:

  需要将testdata中的22条数据更新到testdata2表中  

2.错误方式

  这种方式,由于没有设置更新的限制条件,导致:

  不仅会更新需要更新的表记录,还会将testdata2中剩余的数据字段更新为空。

  

3.解决方案

  添加where条件,只对两表共有的数据进行更新。

  2018/12/05

  正确格式:

UPDATE TABLE1 T1
SET (T1.COLUMN1, T1.COLUMN2) =
(SELECT T2.COLUMN1, T2.COLUMN2 FROM TABLE2 T2 WHERE T2.ID = T1.ID) --两表能够进行关联的字段(一般是主键)
WHERE EXISTS (SELECT 1 FROM TABLE2 T2 WHERE T2.ID = T1.ID);

  错误格式:

UPDATE TABLE1 T1
SET (T1.COLUMN1, T1.COLUMN2) =
(SELECT T2.COLUMN1, T2.COLUMN2 FROM TABLE2 T2 WHERE T2.ID = T1.ID)
WHERE EXISTS (SELECT 1 FROM TABLE1 T1 WHERE T1.ID = T2.ID);--exists()访问不到t2表

  说明:虽然理论上,它们执行效果是一样的,但是由于exists()函数访问不到t2表,所以查询访问不到的那张表t2。

  套用

--添加限制条件,进行更新
update testdata2 t2
set (t2.usercode, t2.userpassword) =
(select t.usercode, t.userpassword
from testdata t
where t.userid = t2.userid)
where exists (select 1 from testdata t where t.userid = t2.userid);

  避免了全表更新。

  2018/12/07

案例二:

4.索引的重要性

  更新1w条以上的数据时,where后面跟的条件一定要加上索引,不然哭都来不及。

  需要更新22w条数据,两张表的ID_CARD字段没有建索引

   两张表的ID_CARD字段建立索引后

  这是我的亲身经历,没有建索引前,执行了4个小时,没有更新完,后来由于电脑关机,导致任务终止;

  建索引后,同样执行该sql,更新22w条数据只用了4秒!!!  

说明:对于要执行的更新sql,使用plsql的预测功能时预测不准确,只做参考。

2019/01/10

案例三:

  将VIRTUAL_CARD表中的ADDRESS字段数据更新至TEST_CARD表中的ADDRESS字段

  方式一:sql实现

UPDATE TEST_CARD T
SET T.ADDRESS =
(SELECT T2.ADDRESS FROM VIRTUAL_CARD T2 WHERE T.CARDNUM = T2.CARDNUM)
WHERE EXISTS (SELECT 1 FROM VIRTUAL_CARD T2 WHERE T2.CARDNUM = T.CARDNUM)

  方式二:借助plsql工具

  将要更新的表的rowid查询出来,并获取最后页

  编辑数据--》选中Address字段所有数据

  右键--》复制--》选中第一列的Address所有数据--》粘贴

  勾选上图绿色勾,提交即可。

  说明:

  大批量修改数据时,推荐使用方式一更新;

  少量数据修改时,两种方式均可。

5.总结

  A表中有几个字段的值需要批量更新,如果一个一个进行修改,太慢了:

  将批量修改后的内容放到一个新的表中B,并与要更新的表A建立关联关系。

  第一步:建新表

  两表关联字段(column1):A表中该字段必须具有唯一性;

  要更新的字段(column5,cloumn6,...)。

  第二步:导数据

  将新表字段及每条记录更新后内容放到excel中,导入oracle数据库中B表。

  第三步:根据两表关联关系,将B表数据批量更新到A表中。

 

oracle 批量更新之将一个表的数据批量更新至另一个表的更多相关文章

  1. mysql中把一个表的数据批量导入另一个表中

    mysql中把一个表的数据批量导入另一个表中   不管是在网站开发还是在应用程序开发中,我们经常会碰到需要将MySQL或MS SQLServer某个表的数据批量导入到另一个表的情况,甚至有时还需要指定 ...

  2. ORACLE 查询一个数据表后通过遍历再插入另一个表中的两种写法

    ORACLE 查询一个数据表后通过遍历再插入另一个表中的两种写法 语法 第一种: 通过使用Oracle语句块  --指定文档所有部门都能查看 declare cursor TABLE_DEPT and ...

  3. 使用POI把查询到的数据表数据导出到Excel中,一个表一个sheet.最详细!!!

    一.需求 我们会遇到开发任务: 经理:小王,你来做一下把数据库里的数据导出到Excel中,一个表是一个sheet,不要一个表一个Excel. 小王:好的,经理.(内心一脸懵逼) 二.前期准备 首先我们 ...

  4. 一条sql解决.一张表的数据复制到另外一张表

    如何把一个表的数组复制到一张表?也许很多人会把这个表查出来的数据再插入到另外一张表里面,这样很麻烦又要写代码逻辑去处理,其实一条sql语句就可以把一张表的数据复制到另外一张表,或者一张表的某一条数据复 ...

  5. hive sql 查询一张表的数据不在另一张表中

    有时,我们需要对比两张表的数据,找到在其中一张表,不在另一张表中的数据 hql 如下: SELECT * FROM (SELECT id FROM a WHERE dt = '2019-03-17' ...

  6. oracle triggers 实现两个结构相同的表的数据级联更新操作

    首先创建两个结构相同的表 -- Create table create table TABLE_TEMP ( userid NUMBER not null, username NVARCHAR2(50 ...

  7. 在oracle中怎么把一张表的数据插入到另一张表中

    把table2表的数据插入到table1中 insert   into   table1   select   *   from   table2

  8. SQL从一个表查询数据插入/更新到另一个表

    示例一: 从数据库表A中查询出数据插入到数据库表B 从数据库DataBaseA的表TDA中查询出数据插入到数据库DataBaseB的表TDB insert into [DataBaseA].[dbo] ...

  9. 通过mapreduce把mysql的一张表的数据导到另外一张表中

    怎么安装hadoop集群我在这里就不多说了,我这里安装的是三节点的集群 先在主节点安装mysql 启动mysql 登录mysql 创建数据库,创建表格,先把数据加载到表格 t ,表格t2是空的 mys ...

随机推荐

  1. Class.forName(String name)方法,到底会触发那个类加载器进行类加载行为?

    4.2 在代码中直接调用Class.forName(String name)方法,到底会触发那个类加载器进行类加载行为? Class.forName(String name)默认会使用调用类的类加载器 ...

  2. x-superobject

    x-superobject GITHUB: https://github.com/onryldz/x-superobject **Delphi Cross Platform Rapid JSON**- ...

  3. 解决Arcgis10.2.2中dbf文件用EXCEL打开乱码问题

    1.开始 -- 运行,输入”Regedit“,打开 注册表 . 2.如是用的是 10.x 版本 ArcGIS Desktop,定位到 ‘计算机\HKEY_CURRENT_USER\Software\E ...

  4. 《SEO深度解析——全面挖掘搜索引擎优化的核心秘密》

    <SEO深度解析——全面挖掘搜索引擎优化的核心秘密> 基本信息 作者: 痞子瑞 出版社:电子工业出版社 ISBN:9787121224041 上架时间:2014-2-28 出版日期:201 ...

  5. 阿里云云盾抗下全球最大DDoS攻击(5亿次请求,95万QPS HTTPS CC攻击) ,阿里百万级QPS资源调度系统,一般的服务器qps多少? QPS/TPS/并发量/系统吞吐量

    阿里云云盾抗下全球最大DDoS攻击(5亿次请求,95万QPS HTTPS CC攻击) 作者:用户 来源:互联网 时间:2016-03-30 13:32:40 安全流量事件https互联网资源 摘要:  ...

  6. 信号处理篇alarm ferror kill mkfifo pause pclose perror pipe popen sigaction sigaddset sigdelset sigemptyset signal sleep strerror

    alarm(设置信号传送闹钟) 相关函数 signal,sleep 表头文件 #include<unistd.h> 定义函数 unsigned int alarm(unsigned int ...

  7. 1、cocos2d-x环境安装

     1 所需软件 2 安装python-2.7.8.amd64.msi 注意将当中的有一步设置,Add python.exe to path 设置python的环境变量 3 解压cocos2d-x- ...

  8. struts 2中为什么抽象包不能包含action?

    struts 2中为什么抽象包不能包含action?麻烦写详细点!

  9. 混沌数学之logistic模型

    logistic回归又称logistic回归分析,主要在流行病学中应用较多,比较常用的情形是探索某疾病的危险因素,根据危险因素预测某疾病发生的概率. 相关DEMO参见:混沌数学之离散点集图形DEMO ...

  10. setw()函数使用

    在C++中,setw(int n)用来控制输出间隔.例如:cout<<'s'<<setw(8)<<'a'<<endl;则在屏幕显示s        a  ...