一个简单的批量更新oracle 数据库中 最近的服务商名称的数据
有一个需求是这样的,我们需要更新数据库中的数据,数据时这样的
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 数据库中 最近的服务商名称的数据的更多相关文章
- 从Oracle数据库中查询前几个月数据时需要注意的一些问题
在最近的一个项目中,有一个需求就是要查询数据库中前几个月的历史数据,但是由于自己考虑不全面造成了程序的bug,现在将这一块好好作一个总结,希望以后不再犯这种很低级的错误,首先贴出查询中用到的一个子函数 ...
- 两种方法将oracle数据库中的一张表的数据导入到另外一个oracle数据库中
oracle数据库实现一张表的数据导入到另外一个数据库的表中的方法有很多,在这介绍两个. 第一种,把oracle查询的数据导出为sql文件,执行sql文件里的insert语句,如下: 第一步,导出sq ...
- SQL Server 得到数据库中所有表的名称及数据条数
--方法一if exists ( select * from dbo.sysobjects where id = object_id(N'[dbo].[TableSpace]') and object ...
- 详解大数据采集引擎之Sqoop&采集oracle数据库中的数据
一.Sqoop的简介: Sqoop是一个数据采集引擎/数据交换引擎,采集关系型数据库(RDBMS)中的数据,主要用于在RDBMS与HDFS/Hive/HBase之间进行数据传递,可以通过sqoop i ...
- Oracle数据库中的数据出错的解决办法
http://www.jcwcn.com/article/database/oracle/ 今天上班犯了一个严重的错误:把我们系统所使用的Oracle数据库中的数据给改掉了!当发现自己改错时,顿时冒了 ...
- 批量解密SQLSERVER数据库中的各种对象的工具dbForge SQL Decryptor
批量解密SQLSERVER数据库中的各种对象的工具dbForge SQL Decryptor2.1.11 之前写过一篇文章,使用redgate公司的SQL PROMPT工具,但是不太方便 SQLPRO ...
- Oracle数据库中调用Java类开发存储过程、函数的方法
Oracle数据库中调用Java类开发存储过程.函数的方法 时间:2014年12月24日 浏览:5538次 oracle数据库的开发非常灵活,不仅支持最基本的SQL,而且还提供了独有的PL/SQL, ...
- sybase数据库和oracle数据库中字段中含有换行符的解决办法
最近在做数据库从sybase到oracle的迁移工作,sybase数据库表bcp导出后,通过sqlldr导入到oracle数据库,然后oracle数据库通过spool按照sybase数据库bcp的格式 ...
- Oracle数据库中插入日期型数据(to_date的用法)(转载)
往Oracle数据库中插入日期型数据(to_date的用法) INSERT INTO FLOOR VALUES ( to_date ( '2007-12-20 18:31:34' , 'YYY ...
随机推荐
- Android出现declaration of org.apache.http.message.BasicLineFormatter appears in /system/framework/
这是由于使用了CloseableHttpClient造成的,把 CloseableHttpClient httpclient = HttpClients.createDefault(); Closea ...
- python-day52--前端html、css
一.html需掌握的: 1. img标签 属性:src alt title width height 2. a标签 属性:href target 3. ul 标签及li 标签,二者都是块级标签 ul ...
- Eclipse详细设置护眼背景色和字体颜色
代码区背景色: 参考地址: http://jingyan.baidu.com/article/d5a880eb6c4f7813f147ccef.html Package explorer 颜色 : ...
- learning shell script prompt to run with superuser privileges (4)
Shell script prompt to run with superuser privileges [Purpose] Check whether have root privil ...
- File storage location distribution in firmware using binwalk
tool function: Binwalk is a fast, easy to use tool for analyzing, reverse engineering, and extractin ...
- Oracle11g 查询长时间运行的SQL
一.大量的查询 某些时候,因为SQL的问题,导致数据库的session大量积压,服务器的磁盘读增大,CPU使用率剧增.一般这种SQL,都是一些全表扫描.多表关联.报表或者排序类的SQL.这中情况很有可 ...
- static 关键字介绍
大家都知道,我们可以基于一个类创建多个该类的对象,每个对象都拥有自己的成员,互相独立.然而在某些时候,我们更希望该类所有的对象共享同一个成员.此时就是 static 大显身手的时候了!! Java 中 ...
- auto类型说明符的注意事项
1.auto类型说明符,是C++11标准下的,它能让编译器自行判断表达式的类型. 2.auto也能在一条语句上声明多个变量,但是,该语句上的多个变量的类型,必须一致. 3.编译器推断出来auto类型可 ...
- 投资银行的IT部门——不同之处与常见误解
投资银行的IT部门——不同之处与常见误解 说了这么多投资银行,投行里面的IT部门究竟是做什么的呢?在过去,投资银行仅靠纸.笔.计算器就能做生意了.但是在今天,所有的部门都要依靠IT技术.交易部门甚至是 ...
- jQuery之阻止默认事件以及解除阻止
大家都知道e.preventDefault()可以阻止默认时间,例如提交功能,但是怎么解除呢?以下参考于网络: 可以使用removeEventListener来移除.但是条件是addEventList ...