| 首页 | 技术文章 | 软件下载 | 博客 | 论坛 | 精品教程 | 黑客动画 | 视频资源 | 在线服务 | 黑客游戏 | 

您现在的位置: 中国X黑客小组 >> 技术文章 >> 编程技术 >> 网络编程 >> 文章正文 用户登录 新用户注册
  在SQL中删除重复记录(多种方法)          【字体:
在SQL中删除重复记录(多种方法)
作者:佚名    文章来源:CnXHacker.Net    点击数:    更新时间:2006-10-27    
学习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

 

---------- ---------------------------------------- ----------

 

         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

 

    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)通过建立临时表来实现

 

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 <(
        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

[1] [2] [3] 下一页

文章录入:IceRiver    责任编辑:IceRiver 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    活地运用SQL Injection做数据
    数据库安全应用 使用MySQL的
    MSSQL数据库SA权限入侵的感悟
    XSS跨站脚本及SQL注入漏洞技
    开源MySQL停止提供企业版源代
    打造SQL Server2000的安全策
    堵死网站被SQL注入的隐患
    拨开迷雾 教你认清在 SSL保
    利用QQLive 新型QQ尾巴病毒疯
    fsqh.exe - fsqh - 进程信息
      网友评论:(只显示最新5条。评论内容只代表网友观点,与本站立场无关!)
    Powered by ICE RIVER - STUDIO
    » CnXHacker.CoM   © CopyRight 2002-2006, CnXHacker.CoM™, Inc. All Rights Reserved.