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

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. 使用opatch工具 打补丁Patch 21352635 -(Database Patch Set Update 11.2.0.4.8)

    Patch 21352635 - Database Patch Set Update 11.2.0.4.8 一.OPatch工具检查及升级 OPatch工具包,在安装目录$ORACLE_HOME下,P ...

  2. EBS标准的查看供应商地址

    --获取供应商PARTY_ID SELECT * FROM HZ_PARTIES HP WHERE HP.PARTY_NAME='XXXXXX' VO数据源:oracle.apps.pos.suppl ...

  3. Centos7 docker 常用指令

    Docker 运行在 CentOS 7 上,要求系统为64位.系统内核版本为 3.10 以上 一.docker的安装及卸载 1.查看当前系统内核版本: [root@docker ~]# uname - ...

  4. gitlab永久设置密码

    在 .gitconfig 文件中加入: [credential]       helper = store .git-credentials close address

  5. css中 font常用的样式属性

    今天我总结一下文本常用的字体样式 1.font常用样式 1)字体类型 语法:font-family: +字体类型:    如: font-family:宋体; 2)字体大小 语法:font-size: ...

  6. 修改cmd窗口mysql的提示符:

    mysql提示符: \D  完整的日期 \d   当前数据库 \h    服务器地址 \u    当前用户 登录数据库的时候设置提示符:  mysql  -uroot  -proot  --promp ...

  7. [转]MVC Html.AntiForgeryToken() 防止CSRF攻击

    [转]MVC Html.AntiForgeryToken() 防止CSRF攻击 本文转自:http://blog.csdn.net/luck901229/article/details/8261640 ...

  8. 读书笔记 C# 控制台应用程序之Main方法浅析

    Main方法是C#控制台应用程序和Windows窗体应用程序的入口点.Main方法可以有形参,也可以没有,可以有返回值(int整型),也可以没有.如下定义: 无返回值.无形参的格式: static v ...

  9. windows安装redis和php拓展

    第一步:下载redis 我是win7的环境,直接到https://github.com/MSOpenTech/redis/releases下载windows版本的redis: 第二步:配置path i ...

  10. NSScanner

    NSScanner NSScanner:该类主要实现对字符串扫描.并且该扫描必须从头到尾扫描(也可以跳到指定的地方进行扫描),开始扫描必须应用到函数,连续的数字之间可以用空格隔开,如:35 15.2 ...