有一个需求是这样的,我们需要更新数据库中的数据,数据时这样的

1.大约50万以上

2. 数据中有较多的重复数据

3. 需要将表中最近的代理商的名称赋值给行中的服务商名称

4. 代理商的名称可能有多个,所以必须获取最近时间的代理商名称

5.对于客户代理商信息的确定必须使用客户主键,以及客户的软件加密狗的id

解决方案

1. 首先会想到

使用数据的遍历,获取客户PK 客户软件狗id 以及客户的代理商名称(最新的根据时间进行排序),进行数据的更新。

将代理商名称更新为服务商名称。

但是性能开销是很大的,同时运行的时间很慢。

这种方法被否决

2. 使用数据库提供的merge into

这种语法在oracle 9i 中才出现,比较庆幸使用的数据库刚好符合,

但是9i 的写法中必须有update 以及insert  这一点不太好 因为我们只想去更新,不用去插入

具体的解决方法如下:

1.创建一个理临时表 这张表的数据时复制需要更新的表的数据

使用的方式如下:

create table table__name as select * from Table_name

为了简单我只需要几个字段所以我同时获取了数据中分组之后的最近时间的数据

sql 代码如下:

select    
          a.CUSTOMER_PK,a.softdog ,a. agentname
  from  
          (select   CUSTOMER_PK,softdog,agentname ,rownum rid    from   testsoftdog1 order by saledate  desc)   a,  
          (select   CUSTOMER_PK,softdog,agentname ,rownum  rid   from   testsoftdog1 order by saledate  desc)   b  
  where  
          a.CUSTOMER_PK=b.CUSTOMER_PK   and   a.softdog=b.softdog and    a.rid>=b.rid
  group   by  
          a.CUSTOMER_PK,a.softdog ,  a.agentname
  having count(*)=1

为什么需要进行分组: 这个主要是我的业务数据的原因有重复的,因为客户主键 软件狗id 本来就可以确定用户的代理商数据,但是代理商数据是会变的,

同时数据库表中存储的数据时多行的,就是说同一客户id 以及软件狗id 可能是多条的数据,所以为了简单进行了数据的分组,以上就为获取最近代理商所有的信息的sql

对于数据的批量更新代码如下:

merge into testsoftdog2 t1
  using ( select    
          a.CUSTOMER_PK,a.softdog ,a. agentname
  from  
          (select   CUSTOMER_PK,softdog,agentname ,rownum rid    from   testsoftdog1 order by saledate  desc)   a,  
          (select   CUSTOMER_PK,softdog,agentname ,rownum  rid   from   testsoftdog1 order by saledate  desc)   b  
  where  
          a.CUSTOMER_PK=b.CUSTOMER_PK   and   a.softdog=b.softdog and    a.rid>=b.rid
  group   by  
          a.CUSTOMER_PK,a.softdog ,  a.agentname
  having count(*)=1) t2
  on (t1.CUSTOMER_PK=t2.CUSTOMER_PK and t1.softdog=t2.softdog)
  when matched then
  update
  set  
  t1.SERVERAGAGENTNAME=t2.agentname;
  when not matched then
  insert
  values(t2.CUSTOMER_PK,t2.softdog,t2.agentname)

红色部分就是我们使用的表的数据,后面就是数据的更新操作了,使用merge into

对于以上红色部分建议的使用方式是进行创建临时表数据。

使用上面的create 语句。

对于sql server 需要使用 select *  into table__name from table_name

以上代码会高效的尽心数据的更新操作,相比遍历的方法快很多,

可能有人会有这样的疑问:为什么使用这种方式呢,你直接使用update 进行数据的更新不就行了吗,

主要是需要获取最新的代理商名称,而且客户的数据时多条的。

附上一个oracle数据批量更新的文章:

http://blog.csdn.net/huanghui22/article/details/1321985

http://www.cnblogs.com/highriver/archive/2011/08/02/2125043.html

一个简单的批量更新oracle 数据库中 最近的服务商名称的数据的更多相关文章

  1. 从Oracle数据库中查询前几个月数据时需要注意的一些问题

    在最近的一个项目中,有一个需求就是要查询数据库中前几个月的历史数据,但是由于自己考虑不全面造成了程序的bug,现在将这一块好好作一个总结,希望以后不再犯这种很低级的错误,首先贴出查询中用到的一个子函数 ...

  2. 两种方法将oracle数据库中的一张表的数据导入到另外一个oracle数据库中

    oracle数据库实现一张表的数据导入到另外一个数据库的表中的方法有很多,在这介绍两个. 第一种,把oracle查询的数据导出为sql文件,执行sql文件里的insert语句,如下: 第一步,导出sq ...

  3. SQL Server 得到数据库中所有表的名称及数据条数

    --方法一if exists ( select * from dbo.sysobjects where id = object_id(N'[dbo].[TableSpace]') and object ...

  4. 详解大数据采集引擎之Sqoop&采集oracle数据库中的数据

    一.Sqoop的简介: Sqoop是一个数据采集引擎/数据交换引擎,采集关系型数据库(RDBMS)中的数据,主要用于在RDBMS与HDFS/Hive/HBase之间进行数据传递,可以通过sqoop i ...

  5. Oracle数据库中的数据出错的解决办法

    http://www.jcwcn.com/article/database/oracle/ 今天上班犯了一个严重的错误:把我们系统所使用的Oracle数据库中的数据给改掉了!当发现自己改错时,顿时冒了 ...

  6. 批量解密SQLSERVER数据库中的各种对象的工具dbForge SQL Decryptor

    批量解密SQLSERVER数据库中的各种对象的工具dbForge SQL Decryptor2.1.11 之前写过一篇文章,使用redgate公司的SQL PROMPT工具,但是不太方便 SQLPRO ...

  7. Oracle数据库中调用Java类开发存储过程、函数的方法

    Oracle数据库中调用Java类开发存储过程.函数的方法 时间:2014年12月24日  浏览:5538次 oracle数据库的开发非常灵活,不仅支持最基本的SQL,而且还提供了独有的PL/SQL, ...

  8. sybase数据库和oracle数据库中字段中含有换行符的解决办法

    最近在做数据库从sybase到oracle的迁移工作,sybase数据库表bcp导出后,通过sqlldr导入到oracle数据库,然后oracle数据库通过spool按照sybase数据库bcp的格式 ...

  9. Oracle数据库中插入日期型数据(to_date的用法)(转载)

    往Oracle数据库中插入日期型数据(to_date的用法) INSERT  INTO  FLOOR  VALUES  ( to_date ( '2007-12-20 18:31:34' , 'YYY ...

随机推荐

  1. 『PyTorch』第五弹_深入理解autograd_中:Variable梯度探究

    查看非叶节点梯度的两种方法 在反向传播过程中非叶子节点的导数计算完之后即被清空.若想查看这些变量的梯度,有两种方法: 使用autograd.grad函数 使用hook autograd.grad和ho ...

  2. darktrace 亮点是使用的无监督学习(贝叶斯网络、聚类、递归贝叶斯估计)发现未知威胁——使用无人监督 机器学习反而允许系统发现罕见的和以前看不见的威胁,这些威胁本身并不依赖 不完善的训练数据集。 学习正常数据,发现异常!

    先说说他们的产品:企业免疫系统(基于异常发现来识别威胁) 可以看到是面向企业内部安全的! 优点整个网络拓扑的三维可视化企业威胁级别的实时全局概述智能地聚类异常泛频谱观测 - 高阶网络拓扑;特定群集,子 ...

  3. 关于向后台请求数据(get请求,无参数传递),返回html代码(实际需要返回的是json数据)的解决方案

    this.$http.get(apis.schoolVideo, { headers: { 'X-Requested-With': 'XMLHttpRequest' } }) 待续

  4. currentSession

    public  class  HibernateUtil  {  public static final ThreadLocal session =new ThreadLocal();  public ...

  5. learning docker steps(2) ----- docker contailner 初次体验

    参考:https://docs.docker-cn.com/get-started/part2/ Dockerfile的内容如下所示: # 将官方 Python 运行时用作父镜像 FROM pytho ...

  6. SQL Server 自动化运维系列 - 监控磁盘剩余空间及SQL Server错误日志(Power Shell)

    需求描述 在我们的生产环境中,大部分情况下需要有自己的运维体制,包括自己健康状态的检测等.如果发生异常,需要提前预警的,通知形式一般为发邮件告知. 在所有的自检流程中最基础的一个就是磁盘剩余空间检测. ...

  7. (C#基础)各种加密学习

    之前,一直想对这个做一个了解,但是总是坚持不下去,很急躁.最近看了几遍文章,很有感触,于是又来重新开始学习,从最最基础的开始——正所谓“慢就是快”.心态变了,继续吧!上代码! using System ...

  8. 在主Android Activity中加载Fragment的一般简易方法 ,来模拟一个微信界面。

    在Fragment的生命周期中,需要重点关注onCreate.onCreateView.onViewCreated.Activity与Fragment生命周期在设计模式上大体一致. package c ...

  9. hpu 1267 Cafeteria (01背包)

    1267: Cafeteria [DP] 时间限制: 1 Sec 内存限制: 128 MB提交: 76 解决: 31 统计 题目描述 Nanae把饥肠辘辘的josnch带去一家自助餐厅,面对面前眼花缭 ...

  10. DevExpress v18.1新版亮点——Windows 10 UWP篇

    用户界面套包DevExpress v18.1日前终于正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了DevExpress Windows 10 UWP v18.1 的新功能,快来下载 ...