今天做了个面试题:查找Oracle数据库中的重复记录,下面详细介绍其他方法(参考其他资料)

本文介绍了几种快速查找ORACLE数据库中的重复记录的方法。

下面以表table_name为例,介绍三种不同的方法来确定库表中重复的记录

方法1:利用分组函数查找表中的重复行:按照某个字段分组,找出行数大于1的列,即由重复记录

利用select 语句中的分组函数GROUP BY/HAVING可以很容易确定重复的行。假设需要创建惟一索引的列为column,

对column用group by分组统计并返回每组的个数,如果组中记录数超过1个就存在重复的行。命令如下:
SQL>Select column from table_name
Group by column
Having count(column)>1;
这种查询方式简便、快捷,是ORACLE数据库中最常用的一种方法

方法2:利用伪列自关联查询

在ORACLE数据库的内部,每一表都有一rowid伪列,行标识惟一标识行,提供对特殊行的快速存取。对该列使用最大(max)或者最小(min)函数可以非常容易地确定重复的行。
1)利用max函数查找重复行
SQL>select column1, column2, column3 from table_name a 
          where  rowid< (select max(rowid) from table_name 
              where column1=a.column1 and column2=a.column2 
              and colum3=a.colum3 and ...);

2).利用min函数查找重复行
SQL>select column1,column2,column3 from table_name a 
              where rowid> (select min(rowid) from table_name 
              where column1=a.column1 and column2=a.column2 
              and colum3=a.colum3 and ...);
不过,当表比较大(例如50万条以上)时,这个方法的效率之差令人无法忍受。

方法3:通过定义完整性约束查找重复行

定义一个完整性约束,integrity constraint是一个限制基表中一列或多列值的规则。可通过对表定义UNIQUE约束,指定惟一关键字。为了满足此约束,在惟一关键字列中不能包含相同的值。因此可用EXCEPTIONS INTO子句,将违背激活的完整性约束的记录存储在一个表(EXCEPTIONS)中,此表必须在使用此选项之前先建好。将EXCEPTIONS表和table_name表通过rowid关联起来即可得到表table_name中重复的记录。 具体方法如下:
     1)创建表EXCEPTIONS,用来存放重复记录的信息。
         SQL>create table exceptions(row_id rowid,
                                   owner varchar2(30),
                                   table_name varchar2(30),
                                   constraint varchar2(30));
2)为表table_name定义惟一(UNIQUE)约束,如果在定义的关键字中包含相同的值,系统将提示ORA-02299: 不能创建 - 有重复的值,并将重复记录的信息存入EXCEPTIONS表中。
SQL>alter table table_name
                add constraint unq_column
                unique(column1,column2,……)
              exceptions into EXCEPTIONS;
2. 将表table_name与EXCEPTIONS通过伪列(rowid)建立关联,伪列相等的记录就是table_name中的重复记录。
SQL>select column1,column2,…… 
from table_name a ,EXCEPTIONS b
              where a.rowid=b.row_id ;

这种方式查询效率较高,而且可以较完全的记录下重复记录的信息,但是步骤较繁琐。

(面试题)如何查找Oracle数据库中的重复记录的更多相关文章

  1. 查找Oracle数据库中的重复记录

    本文介绍了几种快速查找ORACLE数据库中的重复记录的方法. 下面以表table_name为例,介绍三种不同的方法来确定库表中重复的记录 方法1:利用分组函数查找表中的重复行:按照某个字段分组,找出行 ...

  2. 查找 oracle 数据库中包含某一字段的所有表的表名

    select table_name from DBA_TAB_COLUMNS where COLUMN_NAME='字段名'; 字段名需要大写

  3. mysql 数据库中存在重复记录,删除保留其中一条

    DELETE FROM people WHERE peopleName IN ( SELECT peopleName FROM people GROUP BY peopleName HAVING ) ...

  4. Oracle数据库中插入日期型数据(to_date的用法)(转载)

    往Oracle数据库中插入日期型数据(to_date的用法) INSERT  INTO  FLOOR  VALUES  ( to_date ( '2007-12-20 18:31:34' , 'YYY ...

  5. 收集Oracle数据库中的SQL基线信息(一)基础信息收集

    Oracle数据库中的SQL基线信息,当数据库出现性能问题时,在业务无法提供相应业务信息时,通过对比SQL基线信息来查找SQL的变化. 查找数据库一天内运行次数大于5000次的sqlid select ...

  6. 在SQL2008查找某数据库中的列是否存在某个值

    在SQL2008查找某数据库中的列是否存在某个值 --SQL2008查找某数据库中的列是否存在某个值 create proc spFind_Column_In_DB ( @type int,--类型: ...

  7. 将Oracle数据库中的数据写入Excel

    将Oracle数据库中的数据写入Excel 1.准备工作 Oracle数据库"TBYZB_FIELD_PRESSURE"表中数据如图: Excel模板(201512.xls): 2 ...

  8. --关于null在oracle数据库中是否参与计算,进行验证,

    --关于null在oracle数据库中是否参与计算,进行验证,with td as (select null id,1 name from dual ),td1 as ( select null id ...

  9. Oracle数据库中SYS、SYSTEM、DBSNMP、SYSMAN四用户的区别

    [转]   SYS.SYSTEM.DBSNMP. Oracle 数据库中 SYS.SYSTEM.DBSNMP.SYSMAN 四用户的区别 用户: SYS 用户: SYS,默认密码为 CHANGE_ON ...

随机推荐

  1. Java开发 - 异常 - 使用throws

    如果一个方法可能会产生异常,我们需要用throws关键字给它标注会抛出什么异常, 这样就可以在方法调用的时候捕获它. 代码如下: package corejava8.exceptions; publi ...

  2. Python 函数参数引用(传值/传址)/copy/deepcopy

    精简版: 传值:被调函数局部变量改变不会影响主调函数局部变量 传址:被调函数局部变量改变会影响主调函数局部变量 Python参数传递方式:传递对象引用(传值和传址的混合方式),如果是数字,字符串,元组 ...

  3. Linux中Centos7下安装Mysql(更名为Mariadb)

    一.安装: yum install mariadb-server mariadb 二.启动服务: systemctl start mariadb 三.配置大小写敏感问题.和字符为utf8: vim / ...

  4. Spring 在+publicId+和+systemId+之间需要有空格

    今天配置Spring,遇到一个很奇葩的问题: Spring.xml的配置文件内容: <?xml version="1.0" encoding="UTF-8" ...

  5. 原生DOM操作

    注入jQuery var node=document.createElement("script"); node.setAttribute('src','http://common ...

  6. ROS中利用V-rep进行地图构建仿真

    V-rep中显示激光扫描点  在VREP自带的场景中找到practicalPathPlanningDemo.ttt文件,删除场景中多余的物体只保留静态的地图.然后在Model browser→comp ...

  7. spark rdd Transformation和Action 剖析

    1.看到 这篇总结的这么好, 就悄悄的转过来,供学习 wordcount.toDebugString查看RDD的继承链条 所以广义的讲,对任何函数进行某一项操作都可以认为是一个算子,甚至包括求幂次,开 ...

  8. 2014年辛星Javascript解读第三节

    经过第一节的入门和第二节的运算符.那么接下来我们就能够学习Javascript的函数了,当然了.无论大家之前学习的是什么编程语言.都会有函数的概念,假设大家学的是Pascal,还会有"过程& ...

  9. 加载ConversationListActivity以及延迟的使用

    1. 加载会话列表分两步加载. 且第1步和第2步之间有些延迟,便于第1步的结果及时在ListView中显示出来. mHandler.postDelayed(new LoadThreadsExtra() ...

  10. js精确计算(js浮点数精度问题)

    转自:http://talentluke.iteye.com/blog/1767138 大多数语言在处理浮点数的时候都会遇到精度问题,但是在JS里似乎特别严重,来看一个例子 alert(45.6*13 ...