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. Linux内核中container_of函数详解

    http://www.linuxidc.com/Linux/2016-08/134481.htm

  2. systemtap 探针定制

    http://blog.163.com/digoal@126/blog/static/163877040201391123645546/

  3. java hashcode()和equal()方法比较

    通常equals,toString,hashCode,在应用中都会被复写,建立具体对象的特有的内容. 之所以有hashCode方法,是因为在批量的对象比较中,hashCode要比equals来得快,很 ...

  4. Nginx HTTP负载均衡/反向代理的相关参数测试

    原文地址:http://www.cnblogs.com/xiaochaohuashengmi/archive/2011/03/15/1984976.html 测试目的 (1)弄清楚HTTP Upstr ...

  5. 【spring cloud】spring cloud zuul 路由网关

    GitHub源码地址:https://github.com/AngelSXD/springcloud 版本介绍: <properties> <project.build.source ...

  6. 使用spring中的@Transactional注解时,可能需要注意的地方

    前情提要 在编写业务层方法时,会遇到很多需要事务提交的操作,spring框架为我们提供很方便的做法,就是在需要事务提交的方法上添加@Transactional注解,比起我们自己开启事务.提交以及控制回 ...

  7. bashrc和profile的用途和区别

    使用终端登录Linux操作系统的控制台后,会出现一个提示符号(例如:#或~),在这个提示符号之后可以输入命令,Linux根据输入的命令会做回应,这一连串的动作是由一个所谓的Shell来做处理. She ...

  8. how to configure logback for Mybatis to print my SQL

    To log SQL statements for particular mybatis mapper set DEBUG (TRACE to see query parameters and res ...

  9. STM32串口的设置和库函数的介绍

    串口设置的一般步骤可以总结为如下几个: 1) 串口时钟使能, GPIO时钟使能  2) 串口复位 3)GPIO 端口模式设置 4) 串口参数初始化  5) 开启中断并且初始化 NVIC(如果需要开启中 ...

  10. 新鲜出炉!9个超高分辨率的iPhone 6原型素材打包下载

    iPhone 6 出场,设计师又有得忙活了,但是新鲜的资源你们在哪里?!今天我们收集了一组精致的iPhone 6 模型素材,超高分辨率,多种视图,全都打包完毕,点一下就可以拿回家!赶紧来取吧!——   ...