业务需求说明:由于之前公司后台APP端有一个document表,该表中包含了所有的信息,新的需求就是通过该表创建出一个新的用户表(usertable)和一个档案表(document,该表只保留原document的部分字段)。

ps:原document表的数据有25万条的数据,因此在处理的时候,需要考虑到性能的问题。

首先当然是对两个表进行字段的设计,然后是再将原document表中的数据导入到这两个表中。

方案1:第一次采用的是最简单,最直接的方法,但是忽视了效率的问题。

方法是通过查询原document表,依次处理每一条记录,并将处理后的结果再插入到需要新建的两个表。这个方法效率极其的低下,无法接受。于是寻找优化的方法。

方案2:采用oracle数据库自身的sql语句来实现。

1、由于在导入到usertable和document表中需要用到一个字段birthyear,而原document表中没有birthyear字段,因此首先需要对原document表进行添加一个字段birthyear,为了能够添加一个字段,并且不修改原documen表中的信息,我们重新将原document表的数据全部导入一个临时的表document_temp中。因此,这里涉及到两步操作:

  (1)将原document导入到一个临时的document_temp表中

  create table document_temp as  select * from document;

  (2)将document_temp表的数据增加一个字段birthyear

  alter  table document_temp add birthyear;

  update document_temp set birthyear=to_char(createtime,'yyyy')-age;

  update document_test_temp set birthyear =-1 where birthyear is null;

2、根据document_temp表创建新的usertable。

  这里需要说明一下:由于一个用户可能对应的多个document记录,并且会存在同名同姓的情况,因此我们做了一步初步处理,处理的方式是:如果一个人的姓名(name)和出生年份(birthyear)都相同的话,我们认为他们就是同一个人。由于usertable中还有包含该用户拥有的档案总数(record_num)的字段。因此这一步设计到三步。

(1)将document_temp的表数据部分字段导入到usertable中,此时是有重复的。

  insert into USERTABLE_TEST(ID ,ANONAME ,APPID ,BIRTHYEAR ,SEX,HOSPITALNAME ,HOSPITALCODE  )

  select ID ,NAME ,BOOKPOP , BIRTHYEAR  ,SEX  ,HOSPITALNAME ,HOSPITALCODE

  from document_temp
(2)去除重复(在这一步中,由于上面产生的usertable是有25万条记录,对该表进行去除重复是需要考虑性能的问题。)
  1)//删除重复,这种方法对于大批量的数据来说效率非常的慢,这当时不可取的方法。
    delete from usertable_test a where (a.anoname,a.birthyear) in (select anoname,birthyear from usertable_test group by anoname,birthyear having count(*) > 1)
    and rowid not in (select min(rowid) from usertable_test group by Id,seq having count(*)>1)

  2)这种方法跟第一种方法本质上是一样的
    delete usertable_test where rowid not in
    (select min(rowid) from usertable_test group by anoname,birthyear);

  3)后来,受我同学的启发,说查出重复后,不能删除,已删除效率就非常低,于是有下面的方法,但是下面的方式只能产生某些字段,因为我重复的记录是根据这个字段来决定的。
    create table usertable_test_temp select distinct anoname ,birthyear from usertable_test

  4)//针对大量的数据,通过这个可以高效的去除重复
    create table usertable_test_temp as select * from  usertable_test where rowid in
    (select min(rowid) from usertable_test group by anoname,birthyear);
(3)统计字段recordnum的值。
    select count(*) as recordnum ,anoname,birthyear from usertable_test group by anoname,birthyear;

(4)为了简化步骤,可以将第(2)和(3)步进行合并成一步:

  create table usertable_test_temp_temp as select X.*,Y.recordnum from  (select * from  usertable_test_temp where rowid in
  (select min(rowid) from usertable_test_temp group by name,birthyear) ) X left join (select count(*) as recordnum ,name,birthyear from usertable_test_temp group by         name,birthyear) Y  on X.anoname=Y.anoname and X.birthyear=Y.birthyear;

  此时可以得到一个已经去除重复的usertable表。

3、根据document_temp创建一个新的document的表。

  业务要求是:在创建新的document表的时候,通过外键的形式关联userid,即新的document中添加一个字段userid的方式来关联USERTABLE表。所以在导入到新的document中需要关联usertable的id。

  实现的方法:由于usertable也是根据document_temp表导入而来,因此,去重后的usertable与document_temp是有一个对应关系 ,也就是一个用户对应多个document记录。即每一个document_temp记录都有一个用户与之对应。因此可在导入新的document的时候,就将这个对应关系关联起来即可。

insert into document_test (ID,DOCID,USERID,HOSPITALNAME,HOSPITALCODE,IMAGENUM,ANONAME,SEX,AGE,DEPARTMENT,DOCUMENTDATE,DOCUMENTURL,CREATETIME,CHECKPART,CHECKPRO,DOCUMENTPATH,birthyear)
select a.ID,a.ID,b.ID,a.HOSPITALNAME,a.HOSPITALCODE,a.IMAGENUM,a.NAME,a.SEX,a.AGE,a.DEPARTMENT,
a.DOCUMENTDATE,a.DOCUMENTURL,a.CREATETIME,a.CHECKPART,a.CHECKPRO,a.DOCUMENTPATH, a.BIRTHYEAR
 from  document_temp  a , usertable  b   where a.anoname = b.anoname and a.birthyear = b.birthyear

Oracle数据库高效sql语句的整理的更多相关文章

  1. Oracle数据库 基础SQL语句练习

    一.说明 第一次使用Oracle,想做一些练习,熟悉一些oracle. 表:使用的是scott用户,默认的表 具体表讲解,可以参考该文档:https://www.cnblogs.com/xjcheng ...

  2. Oracle数据库的sql语句性能优化

    在应用系统开发初期,由于开发数据库数据比较少,对于查询sql语句,复杂试图的编写等体会不出sql语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为目 ...

  3. oracle数据库常用SQL语句(11.29更新)

    笔者日常工作中常用到的sql语句,现总结如下,留作日后查看. 1.按照两列中的最大值取 ,只取两列其中的一列 SELECT * FROM t_doc T ORDER BY GREATEST(T.Loa ...

  4. Oracle数据库常用Sql语句大全

    一,数据控制语句 (DML) 部分 1.INSERT  (往数据表里插入记录的语句) INSERT INTO 表名(字段名1, 字段名2, ……) VALUES ( 值1, 值2, ……); INSE ...

  5. Oracle数据库入门——sql语句和函数详解

    一.oracle常用数据类型 一.  数据定义语言(ddl) 数据定义语言ddl(data definition language)用于改变数据库结构,包括创建.更改和删除数据库对象. 用于操纵表结构 ...

  6. oracle数据库常用SQL语句

    1)删除表的一列 ALTER TABLE 表名 DROP COLUMN 列名; 2)增加表的一列 且默认值为0 alter table 表名 add 字段名 类型 default '0'; 3)修改表 ...

  7. Python使用cx_Oracle模块操作Oracle数据库--通过sql语句和存储操作

    https://www.jb51.net/article/125160.htm?utm_medium=referral  Python使用cx_Oracle调用Oracle存储过程的方法示例 http ...

  8. oracle数据库入门sql语句

    数据库: 命名规范问题 依然是 _流.看来也确实应该抽空 来处理一下 今天吧,不行时间不能浪费.要更加专注.累了 就睡,醒来 就 好好 弄东西.白天 哪怕累一些,强度 大一些,晚上也可以抽空出去.溜溜 ...

  9. Oracle 数据库常用SQL语句(2)查询语句

    一.SQL基础查询 1.select语句 格式:select 字段 from 表名; 2.where 用于限制查询的结果. 3.查询条件 > < >= <= = != 4.与 ...

随机推荐

  1. 04-时序逻辑电路设计之计数器——小梅哥FPGA设计思想与验证方法视频教程配套文档

    芯航线--普利斯队长精心奉献 实验目的:以计数器为例学会简单的时序逻辑电路设计 实验平台:芯航线FPGA核心板 实验原理: 时序逻辑电路是指电路任何时刻的稳态输出不仅取决于当前的输入,还与前一时刻输入 ...

  2. Eclipse建立Maven项目后无法建立src/main/java资源文件夹

    在项目上右键选择properties,然后点击java build path,在Librarys下,编辑JRE System Library,选择workspace default jre就可以了.

  3. 读取NVRAM中的SN(barcode)

    在Custom_NvRam_LID.h中,找到需要读取的ID对应的值 实现NvRAMAgent import java.lang.String; import android.os.RemoteExc ...

  4. 禁止输入中文 与 禁止输入数字在phonegap api环境效果

    例子如下: <!doctype html> <html> <head> <meta charset="utf-8"> <tit ...

  5. noi 2718 移动路线

    题目链接: http://noi.openjudge.cn/ch0206/2718/ 右上角的方案数 f(m,n) = f(m-1,n) + f(m,n-1); http://paste.ubuntu ...

  6. 【译】微型ORM:PetaPoco【不完整的翻译】

    PetaPoco是一款适用于.Net 和Mono的微小.快速.单文件的微型ORM. PetaPoco有以下特色: 微小,没有依赖项……单个的C#文件可以方便的添加到任何项目中. 工作于严格的没有装饰的 ...

  7. [问题2014A08] 复旦高等代数 I(14级)每周一题(第十教学周)

    [问题2014A08]  设 \(A=(a_{ij})\) 为数域 \(\mathbb{K}\) 上的 \(n\) 阶方阵, 定义函数 \[f(A)=\sum_{i,j=1}^na_{ij}^2.\] ...

  8. Python3基础 print 查看一个列表中存储的所有内容

    镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...

  9. 欧姆龙PLC---FINS/TCP

    ETN 21 以太网fins/tcp命令 (1)将电脑和PLC设置为同一个网段 例如电脑IP为192.168.18.214,PLC的IP为192.168.18.4(PLC的端口默认为9600) (2) ...

  10. [翻译]LSP程序的分类

    翻译的太垃圾,不建议其它人阅读本文. Note:LSP现在已经不推荐使用.自windows8和windows Server2012开始,使用Windows Filtering Platform. Wi ...