当前位置:  数据库>oracle

Oracle删除重复记录的几种方式

    来源: 互联网  发布时间:2017-05-22

    本文导语: Oracle删除重复记录的几种方式 如果把一个文件多次导入数据库,可能会引入重复记录,那么有哪些方法可以删除重复记录呢?  REATE TABLE tbl_test(  SER_NO NUMBER,  FST_NM VARCHAR2(30),  DEPTID NUMBER,  CMNT  VARCHAR2(30));   INSERT INTO tbl_tes...

Oracle删除重复记录的几种方式

如果把一个文件多次导入数据库,可能会引入重复记录,那么有哪些方法可以删除重复记录呢?

 REATE TABLE tbl_test(
  SER_NO NUMBER,
  FST_NM VARCHAR2(30),
  DEPTID NUMBER,
  CMNT  VARCHAR2(30));
 
 INSERT INTO tbl_test VALUES(1, 'aaaaa', 2004, 'xxx');
 INSERT INTO tbl_test VALUES(2, 'bbbbb', 2005, 'yyy');
 INSERT INTO tbl_test VALUES(1, 'aaaaa', 2004, 'xxx');
 INSERT INTO tbl_test VALUES(1, 'aaaaa', 2004, 'xxx');
 INSERT INTO tbl_test VALUES(3, 'ccccc', 2005, 'zzz');
 INSERT INTO tbl_test VALUES(2, 'bbbbb', 2005, 'yyy');
 
1.Using MIN(rowid) 最常用的方法,但是数据量大的话执行会很长时间
 
 DELETE FROM tbl_test
    WHERE ROWID NOT IN (SELECT  MIN (ROWID)
          FROM tbl_test
        GROUP BY ser_no, fst_nm, deptid, cmnt);
       
2.Using MIN(rowid) & Join 跟第一条差不多

 DELETE FROM tbl_test t
    WHERE t.ROWID NOT IN (SELECT MIN (b.ROWID)
          FROM tbl_test b
        WHERE b.ser_no = t.ser_no
          AND b.fst_nm = t.fst_nm
          AND b.deptid = t.deptid
          AND b.cmnt  = t.cmnt);
         
3.Using Subquery

 DELETE FROM tbl_test
 WHERE ser_no IN (SELECT ser_no FROM tbl_test GROUP BY ser_no, fst_nm, deptid, cmnt HAVING COUNT (*) > 1)
 AND fst_nm IN (SELECT fst_nm FROM tbl_test GROUP BY ser_no, fst_nm, deptid, cmnt HAVING COUNT (*) > 1)
 AND deptid IN (SELECT deptid FROM tbl_test GROUP BY ser_no, fst_nm, deptid, cmnt HAVING COUNT (*) > 1)
 AND cmnt  IN (SELECT cmnt  FROM tbl_test GROUP BY ser_no, fst_nm, deptid, cmnt HAVING COUNT (*) > 1)
 AND ROWID NOT IN (SELECT  MIN (ROWID)
 FROM tbl_test
    GROUP BY ser_no, fst_nm, deptid, cmnt
 HAVING COUNT (*) > 1)         
       
4. Using Nested Subqueries     

 DELETE FROM tbl_test a WHERE (a.ser_no, a.fst_nm, a.deptid, a.cmnt) IN (SELECT b.ser_no, b.fst_nm, b.deptid, b.cmnt
 FROM tbl_test b WHERE a.ser_no = b.ser_no AND a.fst_nm = b.fst_nm AND a.deptid = b.deptid AND a.cmnt  = b.cmnt AND
 a.ROWID  > b.ROWID);
               
5. Using Analytic Fucntions: 对于大表这是最有效的方法

 DELETE FROM tbl_test WHERE ROWID IN (SELECT rid FROM (SELECT ROWID rid,
 ROW_NUMBER () OVER (PARTITION BY ser_no, fst_nm, deptid, cmnt ORDER BY ROWID) rn FROM tbl_test)WHERE rn 1);             
     
6. CREATE-DROP-RENAME 对资源使用比较合理,特别对于大表。但是如果需要回滚则会产生大量undo日志信息。
 
 CREATE  TABLE tbl_test1 NOLOGGING AS SELECT tbl_test .*
 FROM tbl_test tbl_test WHERE ROWID IN (SELECT rid
 FROM (SELECT ROWID rid, ROW_NUMBER() OVER (PARTITION BY ser_no, fst_nm, deptid, cmnt ORDER BY ROWID) rn
 FROM tbl_test) WHERE rn=1);
     
 DROP TABLE tbl_test; --drop the original table with lots of duplicate 
 
 RENAME tbl_test1 TO tbl_test; -- your original table without duplicates.


    
 
 

您可能感兴趣的文章:

  • 请教:为什么删除不掉?我用超级用户删除某一文件夹rm -R oracle失败。
  • 在linux 中如何删除oracle db 与卸载oracle.
  • Oracle删除表前判断表名是否存在若存在则删除
  • oracle创建删除用户示例分享(oracle删除用户命令及授权)
  • oracle 彻底删除方法
  • Oracle删除后不能重新安装的解决方法
  • ubuntu如何彻底删除oracle
  • 彻底删除Oracle数据库的方法
  • Oracle删除当前用户下所有表的方法适用于有或没有删除权限
  • shell脚本操作oracle删除表空间、创建表空间、删除用户
  • 技巧分享 删除Oracle10G中的垃圾表
  • Oracle删除带有空格的表
  • 请问怎么用jsp语句删除oracle中的一条记录?
  • Linux环境下完全删除Oracle
  • oracle怎么删除用户提供解决方案
  • linux下如何卸载oracle?直接删除就可以么??
  • oracle单库彻底删除干净的执行步骤
  • 删除Oracle中奇怪的表名称BIN$…的方法
  • linux oracle数据库删除操作指南
  • oracle数据库添加或删除一列的sql语句
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • linux下通过对文件读取方式查询oracle的版本信息
  • 参加Oracle认证的两种考试方式
  • Oracle解锁的方式介绍
  • Linux操作系统下Oracle数据库多实例启动方式及修改内存
  • 如何实现将客户机上的word文件,以B/S方式最终存入oracle数据库?
  • Oracle数据库的四种启动方式
  • oracle中得到一条SQL语句的执行时间的两种方式
  • 基础知识:Oracle数据库的启动方式
  • oracle中修改表名的几种方式
  • Oracle数据库三种的封锁方式
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 从jsp想oracle插入记录的顺序问题
  • 紧急求救:为什么oracle只能选择一定数据的记录
  • 记录Linux下一次oracle启动错误
  • ejb的bmp向oracle表插入图片记录的问题!
  • 给200分:oracle的jdbc有BUG??为何在servlet中记录数不能超过120条?
  • 关于JDBC访问Oracle返回数据集的记录限制的问题
  • Oracle 如何快速查找和删除重复记录
  • Oracle 当前用户下所有表的记录总数
  • Oracle中用Rowid查找和删除重复记录
  • 如何确定Oracle数据库表重复的记录
  • shell向oracle插记录 小问题送分了,谢谢
  • 利用ASP来实现Oracle数据记录的分页显示
  • Oracle数据库设置任务计划备份一周的备份记录
  • Linux(Oracle系统在上面)系统无缘无故死机 , 可能是由于应用程序引起 , 可是由于重新启动查不到相关信息 , 不知道在哪里有记录系统CPU Lo
  • MySQL数据迁移到Oracle记录
  • Oracle中取固定记录数详细步骤
  • Oracle基本操作全记录
  • SQL查询前10条记录(SqlServer/mysql/oracle)的语法分析
  • 在oracle下要在同一事务下插入多条记录,该怎么做??最好要有原代码
  • oracle快速删除重复的记录
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • 虚拟机装Oracle R12与Oracle10g
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • Oracle 数据库开发工具 Oracle SQL Developer
  • Oracle 10g和Oracle 11g网格技术介绍
  • Oracle EBS R12 支持 Oracle Database 11g
  • oracle中如何把表中具有相同值列的多行数据合并成一行


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,