网管联盟 | 网管论坛 | 网管u家 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 
中国网管联盟
Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道
 当前位置: > bitsCN.com > 数据库技术 > Oracle > PL/SQL > 在SQL中删除重复记录(多种方法)  

在SQL中删除重复记录(多种方法)

2005-10-10  作者:BitsCN整理  来源:中国网管联盟  点评 投稿 收藏


  学习sql有一段时间了,发现在我建了一个用来测试的表(没有建索引)中出现了许多的重复记录。后来总结了一些删除重复记录的方法,在Oracle中,可以通过唯一rowid实现删除重复记录;还可以建临时表来实现...这个只提到其中的几种简单实用的方法,希望可以和大家分享(以表employee为例)。
  
  SQL> desc employee
  
   Name                   Null?  Type
   ----------------------------------------- -------- ------------------
  
  emp_id                        NUMBER(10)
  emp_name                      VARCHAR2(20)
  
  salary                         NUMBER(10,2)
  
  可以通过下面的语句查询重复的记录:
  
  SQL> select * from employee;
  
    EMP_ID EMP_NAME                 SALARY
  
  ---------- ---------------------------------------- ---------- 网管论坛bbs_bitsCN_com
  
       1 sunshine                   10000
  
       1 sunshine                   10000
  
       2 semon                     20000
  
       2 semon                     20000
  
       3 xyz                      30000
  
       2 semon                     20000
  
  SQL> select distinct * from employee;
  
    EMP_ID EMP_NAME                   SALARY
  
  ---------- ---------------------------------------- ----------
  
       1 sunshine                   10000
  
       2 semon                     20000
  
       3 xyz                       30000
  
  SQL> select * from employee group by emp_id,emp_name,salary having count (*)>1
中国网管联盟bitsCN.com

  
    EMP_ID EMP_NAME                   SALARY
  
  ---------- ---------------------------------------- ----------
  
       1 sunshine                   10000
  
       2 semon                     20000
  
  SQL> select * from employee e1
  
  where rowid in (select max(rowid) from employe e2
  
  where e1.emp_id=e2.emp_id and
  
  e1.emp_name=e2.emp_name and e1.salary=e2.salary);
  
    EMP_ID EMP_NAME                   SALARY
  
  ---------- ---------------------------------------- ----------
  
       1 sunshine                   10000
  
       3 xyz                       30000
  
       2 semon                     20000
  
  2. 删除的几种方法:
  
  (1)通过建立临时表来实现 网管u家u.bitsCN.com
  
  SQL>create table temp_emp as (select distinct * from employee)
  
  SQL> truncate table employee; (清空employee表的数据)
  
  SQL> insert into employee select * from temp_emp; (再将临时表里的内容插回来)
  
  ( 2)通过唯一rowid实现删除重复记录.在Oracle中,每一条记录都有一个rowid,rowid在整个数据库中是唯一的,rowid确定了每条记录是在Oracle中的哪一个数据文件、块、行上。在重复的记录中,可能所有列的内容都相同,但rowid不会相同,所以只要确定出重复记录中那些具有最大或最小rowid的就可以了,其余全部删除。
  
  SQL>delete from employee e2 where rowid not in (
  select max(e1.rowid) from employee e1 where
  
  e1.emp_id=e2.emp_id and e1.emp_name=e2.emp_name and e1.salary=e2.salary);--这里用min(rowid)也可以。
  
  SQL>delete from employee e2 where rowid <(
网管u家www.bitscn.net

  select max(e1.rowid) from employee e1 where
  e1.emp_id=e2.emp_id and e1.emp_name=e2.emp_name and
  e1.salary=e2.salary);
  
  (3)也是通过rowid,但效率更高。
  
  SQL>delete from employee where rowid not in (
  select max(t1.rowid) from employee t1 group by
  
  t1.emp_id,t1.emp_name,t1.salary);--这里用min(rowid)也可以。
  
    EMP_ID EMP_NAME                   SALARY
  
  ---------- ---------------------------------------- ----------
  
       1 sunshine                   10000
  
       3 xyz                       30000
  
       2 semon                     20000
  
  SQL> desc employee
  
   Name                   Null?  Type
   ----------------------------------------- -------- ------------------ 网管联盟bitsCN@com
  
  emp_id                        NUMBER(10)
  emp_name                      VARCHAR2(20)
  
  salary                         NUMBER(10,2)
  
  可以通过下面的语句查询重复的记录:
  
  SQL> select * from employee;
  
    EMP_ID EMP_NAME                 SALARY
  
  ---------- ---------------------------------------- ----------
  
       1 sunshine                   10000
  
       1 sunshine                   10000
  
       2 semon                     20000
  
       2 semon                     20000
  
       3 xyz                      30000
  
       2 semon                     20000
  
  SQL> select distinct * from employee;

网管网www_bitscn_com


  
    EMP_ID EMP_NAME                   SALARY
  
  ---------- ---------------------------------------- ----------
  
       1 sunshine                   10000
  
       2 semon                     20000
  
       3 xyz                       30000
  
  SQL> select * from employee group by emp_id,emp_name,salary having count (*)>1
  
    EMP_ID EMP_NAME                   SALARY
  
  ---------- ---------------------------------------- ----------
  
       1 sunshine                   10000
  
       2 semon                     20000
  
  
  SQL> select * from employee e1
  
  where rowid in (select max(rowid) from employe e2
  where e1.emp_id=e2.emp_id and
网管u家u.bitsCN.com

  
  e1.emp_name=e2.emp_name and e1.salary=e2.salary);
  
    EMP_ID EMP_NAME                   SALARY
  
  ---------- ---------------------------------------- ----------
  
       1 sunshine                   10000
  
       3 xyz                       30000
  
       2 semon                     20000
  
  2. 删除的几种方法:
  
  (1)通过建立临时表来实现
  
  SQL>create table temp_emp as (select distinct * from employee)
  
  SQL> truncate table employee; (清空employee表的数据)
  
  SQL> insert into employee select * from temp_emp; (再将临时表里的内容插回来)
  
  ( 2)通过唯一rowid实现删除重复记录.在Oracle中,每一条记录都有一个rowid,rowid在整个数据库中是唯一的,rowid确定了每条记录是在Oracle中的哪一个数据文件、块、行上。在重复的记录中,可能所有列的内容都相同,但rowid不会相同,所以只要确定出重复记录中那些具有最大或最小rowid的就可以了,其余全部删除。

中国网管联盟bitsCN.com


  
  SQL>delete from employee e2 where rowid not in (
  select max(e1.rowid) from employee e1 where
  
  e1.emp_id=e2.emp_id and e1.emp_name=e2.emp_name and e1.salary=e2.salary);--这里用min(row
TAGs多种   方法   记录   重复   删除   SQL   rowid   2semon20000   1sunshine10000    
 上一篇:MySQL如何对抗解密高手   下一篇:新手上路:Oracle分析函数学习笔记三
相关文章列表
在SQL中删除重复记录(多种方法) 评论:
loading.. 评论加载中…
评论:请自觉遵守互联网相关政策法规,评论不得超过250字。

验证码: 注册用户
本类热门排行:
1.PL/SQL - 嵌套游标 cursor-PLSQL
2.用一个实例讲解Oracle数据库的PL/SQL语句
3.PL/SQL----触发器-PLSQL
4.mysql存储过程写法—动态参数运用-PLSQL
5.PL/SQL Developer导出分区索引脚本-PLSQL
6.PL/SQL collection— table() 函数-PLSQL
7.SQL Server 2005 中的架构与用户-PLSQL
8.Oracle数据库维护常用SQL语句集合(2)-P
9.Oracle数据库维护常用SQL语句集合(3)-P
10.再议SQL Server临时表和表变量-PLSQL
最新推荐文章:
1.与数据库无关的处理放到数据库以外来实现
2.Oracle 10g第2版新特性之SQL和PL/SQL
3.通过PL/SQL访问Web Services
4.菜鸟学oracle - 用PL/SQL画直方图
5.重新编译PLSQL中无效对象或指定对象
6.Oracle高级技巧
7.深入了解Oracle 10g新的多重集运算符
8.在SQL中删除重复记录(多种方法)
9.Oracle:PL/SQL中怎样使用Array
10.数据库手册:速查Oracle函数列表
网管论坛交流:
·大家来开心一下吧---看了会很开心的东西-
·中国人不可不知道的知识
·@@小鹏◎◎小鹏同志与某位女明星亲密接触
·◎◎小鹏◎◎发现不明生物,居然正在交配
·[图文]^^^版主是什么?????
·泡论坛的女人是好女人
·做个“水性杨花”的女人
·献给mm俱乐部的所有mm
·深圳一集团企业电脑基础应用培训教程
·■■■■十一遊玩照■■■■■