一个简单的批量更新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 ...
随机推荐
- 最小生成树(模板 Kruskal)
Description 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达 ...
- dp练习(2)——老鼠的旅行
1267 老鼠的旅行(来源:codevs) #include "bits/stdc++.h" using namespace std; ][]; ][]; int main() { ...
- oracle EBS grant 您不具有执行当前操作的足够权限。请与您的系统管理员联系。
解决方式1: Set the profiles of the below three to 'None' 设置以下三个配置文件为无 FND_VALIDATION_LEVELFND 验证层 FND_FU ...
- drawImage
<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head> < ...
- 使用Condition配合await()和signal()实现等待/通知
关键字Synchronized与wait()和notify()/notifyAll()结合可以实现“等待/通知”模式, Lock类的子类ReentrantLock也可以实现同样的功能,但需要借助Con ...
- CSRmesh Application
1.CSRmesh Control Application v2.0.1版本可以运行在支持BLE4.0的Android设备上,该版本在Android4.4.4.5.0.5.0.1.5.0.2.5.1和 ...
- Double H5.0
Alpha阶段 - 博客链接合集 项目Github地址 Github 敏捷冲刺日志 Alpha冲刺! Day1 - 磨刀 Alpha冲刺! Day2 - 砍柴 Alpha冲刺! Day3 - 砍柴 A ...
- 如何提升ACTION_SIM_STATE_CHANGED的接收速度?
在Android中,BroadcastReceiver分动态注册和静态注册. 静态注册的一个优势就是:当你的BroadcastReceiver可以接受系统中 某个broadcast时,系统会自动启动你 ...
- FDMemTable.Delta 转SQL语句脚本
{*******************************************************} { } { XE7.XE8.XE10 安卓 IOS 框架 } { } { 版权所有 ...
- webbench源码学习-->命令行选项解析函数getopt和getopt_long函数
对于webbench这个网站压力测试工具网上介绍的很多,有深度详解剖析的,对于背景就不在提了, 听说最多可以模拟3万个并发连接去测试网站的负载能力,这里主要是学习了一下它的源码,做点 笔记. 官方介绍 ...