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

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. Sqlite3,维基百科中的练习:

    https://en.wikibooks.org/wiki/SQL_Exercises/The_computer_store 两个相连的表格 Manufactures: code, name prod ...

  2. codeforces 487a//Fight the Monster// Codeforces Round #278(Div. 1)

    题意:打怪兽.可增加自己的属性,怎样在能打倒怪兽的情况下花费最少? 这题关键要找好二分的量.一开始我觉得,只要攻击到101,防御到100,就能必胜,于是我对自己的三个属性的和二分(0到201),内部三 ...

  3. C#下实现的K-Means优化[1]-「离群点检测」

    资源下载 #本文PDF版下载 C#下实现的K-Means优化[1]-「离群点检测」 前言 在上一篇博文中,我和大家分享了「C # 下实现的多维基础K-MEANS聚类」的[C#下实现的基础K-MEANS ...

  4. hdu2087kmp

    一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢?  Input输入中含有一些数据,分别是成对出现的花布条和 ...

  5. python-day59--前端 jQuery

    一.什么是jQuery?       http://jquery.cuishifeng.cn/ 类似Python里面的模块 是js的一个库/插件/工具 二.JS和jQuery的关系 - jQuery就 ...

  6. Linux 强制安装rpm 包

    Linux 强制安装rpm 包 2014年12月12日 10:21 [root@ilearndb1 Server]# rpm -ivh  unixODBC-devel-2.*  --nodeps -- ...

  7. svn出错:directory 'xxxx' is out of date

  8. poj 1330 Nearest Common Ancestors(LCA 基于二分搜索+st&rmq的LCA)

    Nearest Common Ancestors Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 30147   Accept ...

  9. git在idea中的使用,如何构远程git方仓库

    git 下载:http://learning.happymmall.com/git/   配置用户名:$ git config --glob user.name "forever" ...

  10. 一张图告诉你为何必须学Python?

    互联网行业的薪资高.发展前景好,已经是人尽皆知的事了.越来越多的人对编程有了兴趣,想通过加入大公司实现人生逆袭,我们身边也涌现出了一些从零学习.变身大神的励志故事. 但更多的人还是选择观望:有人觉得编 ...