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

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. Windows 10 设置 Java 环境变量

    首先你需要在我的电脑中打开,找到环境变量属性. 找到环境变量属性 找到环境变量属性后单击将会看到下面的设置界面. 在这个界面中设置高级系统设置. 环境变量 在弹出的界面中选择设置环境变量. 系统变量 ...

  2. 42 前端HTML

    HTML 1.  概念       HTML  超文本标记语言(Hypertext Markup Language, HTML)是一种用于创建网页的标记语言  . 2.标签 Meta标签 <me ...

  3. luogu P2408 不同子串个数

    考虑反向操作,去计算有多少组相同的子串,对于一组大小为k的极大相同子串的集合,ans-=k-1. 为了避免重复计算,需要一种有效的,有顺序的记录方案. 比如说,对于每一个相同组,按其起始点所在的位置排 ...

  4. 『Python』图像金字塔、滑动窗口和非极大值抑制实现

    图像金字塔 1.在从cv2.resize中,传入参数时先列后行的 2.使用了python中的生成器,调用时使用for i in pyramid即可 3.scaleFactor是缩放因子,需要保证缩放后 ...

  5. Java网络编程和NIO详解8:浅析mmap和Direct Buffer

    Java网络编程与NIO详解8:浅析mmap和Direct Buffer 本系列文章首发于我的个人博客:https://h2pl.github.io/ 欢迎阅览我的CSDN专栏:Java网络编程和NI ...

  6. splunk中mongodb作用——存用户相关数据如会话、搜索结果等

    About the app key value store The app key value store (or KV store) provides a way to save and retri ...

  7. JavaScript学习总结(八)——JavaScript数组

    JavaScript中的Array对象就是数组,首先是一个动态数组,无需预先制定大小,而且是一个像Java中数组.ArrayList.Hashtable等的超强综合体. 一.数组的声明 常规方式声明: ...

  8. string logo online customization

    url: http://www.asciiarts.net/ example :  hello

  9. SQL Server 调优系列玩转篇三(利用索引提示(Hint)引导语句最大优化运行)

    前言 本篇继续玩转模块的内容,关于索引在SQL Server的位置无须多言,本篇将分析如何利用Hint引导语句充分利用索引进行运行,同样,还是希望扎实掌握前面一系列的内容,才进入本模块的内容分析. 闲 ...

  10. 用sql + Ado设置access的字段的默认值

    procedure TFormLOrder.ModifyDB; var F: Integer; begin with TADOQuery.Create(nil) do try // Connectio ...