今天做了个面试题:查找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开发 - 异常 - 抛出异常

    问题: 如何抛出一个系统异常并且捕获它 代码如下: public class ThrowDemo { static void demoproc() { try { throw new NullPoin ...

  2. 牛客网-《剑指offer》-数值的整数次方[快速幂运算]

    题目:http://www.nowcoder.com/practice/1a834e5e3e1a4b7ba251417554e07c00 /**  * 1.全面考察指数的正负.底数是否为零等情况.   ...

  3. hadoop old API CombineFileInputFormat

    来自:http://f.dataguru.cn/thread-271645-1-1.html 简介 本文主要介绍下面4个方面 1.为什么要使用CombineFileInputFormat 2.Comb ...

  4. linux 新进程的创建

    慕课18原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.背景知识: 1. ...

  5. Maven的坐标与资源库

    在Maven世界中,每个工程都有它唯一的 组织名.模块名.版本 ,这三个就是maven项目的坐标,一个maven工程可以打包成jar.war.pom等形式,但是它们都是拥有上述三个坐标的.我们在项目过 ...

  6. kettle实现数据库迁移----多表复制向导

    kettle实现数据库迁移----多表复制向导 需求: 做数据仓库时,需要将业务系统CRM抽取到数据仓库的缓冲层,业务系统使用的是SqlServer数据库,数据仓库的缓冲层使用的是mysql数据库,为 ...

  7. soapui not supported the auto complete

    http://forum.soapui.org/viewtopic.php?t=19850 syntax highlighting or content assist inside soapUI? t ...

  8. 【Linux】awk详细介绍

    awk简介 awk是一种使用方便且表现力很强的编程语言,它可以应用在多种不同的计算与数据处理任务中.由于awk天生提供对文件中文本分列进行处理,所以如果一个文件中的每行都被特定的分隔符(常见的是空格) ...

  9. 在Docker容器中运行Spring Boot的jar包 jar外的配置文件无法生效

    Spring Boot加载配置文件,默认会从几个固定位置搜索一下看看有没有配置文件 ——application.properties或者bootstrap.properties(如果你使用了sprin ...

  10. code vs 1013 求先序排列

    2001年NOIP全国联赛普及组 题目描述 Description 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度<=8). 输入描述 Input De ...