网站导航网学 原创论文 原创专题 网站设计 最新系统 原创论文 论文降重 发表论文 论文发表 UI设计定制 论文答辩PPT格式排版 期刊发表 论文专题
返回网学首页
网学原创论文
最新论文 推荐专题 热门论文 论文专题
当前位置: 网学 > 交易代码 > SQL语法 > 正文

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

论文降重修改服务、格式排版等 获取论文 论文降重及排版 论文发表 相关服务

【网学网提醒】:网学会员为广大网友收集整理了,在SQL中删除重复记录(多种方法),希望对大家有所帮助!


    学习sql有一段时间了,发现在我建了一个用来测试的表(没有建索引)中出现了许多的重复记录。后来总结了一些删除重复记录的方法,在Oracle中,可以通过唯一rowid实现删除重复记录;还可以建临时表来实现...这个只提到其中的几种简单实用的方法,希望可以和大家分享(以表employee为例)。SQL>descemployee
    NameNull?-------------------------------------------------------------------
    Type
    emp_idemp_name
    NUMBER(10)VARCHAR2(20)
    salary
    NUMBER(10,2)
    可以通过下面的语句查询重复的记录:
     SQL>select*fromemployee;
    EMP_IDEMP_NAME
    SALARY
    ------------------------------------------------------------
    1sunshine
    10000
    1sunshine
    10000
    2semon
    20000
    2semon
    20000
     3xyz
    30000
    2semon
    20000
    SQL>selectdistinct*fromemployee;
    SQL>selectdistinct*fromemployee;
    EMP_IDEMP_NAME
    SALARY
    ------------------------------------------------------------
    1sunshine
    10000
     2semon
    20000
    3xyz
    30000
    SQL>
    select*fromemployeegroupbyemp_id,emp_name,salaryhavingcount(*)>1
    EMP_IDEMP_NAME
    SALARY
    ------------------------------------------------------------
    1sunshine
    10000
    2semon
    20000
    SQL>select*fromemployeee1
     whererowidin(selectmax(rowid)fromemployee2wheree1.emp_id=e2.emp_idand
    e1.emp_name=e2.emp_nameande1.salary=e2.salary);
    EMP_IDEMP_NAME
    SALARY
    ------------------------------------------------------------
    1sunshine
    10000
    3xyz
    30000
     2semon
    20000
    2.删除的几种方法:
    (1)通过建立临时表来实现
    SQL>createtabletemp_empas(selectdistinct*fromemployee)
    SQL>truncatetableemployee;(清空employee表的数据)
    SQL>insertintoemployeeselect*fromtemp_emp;
    (再将临时表里的内容插回来)
     (2)通过唯一rowid实现删除重复记录.在Oracle中,每一条记录都有一个rowid,rowid在整个数据库中是唯一的,rowid确定了每条记录是在Oracle中的哪一个数据文件、行上。块、在重复的记录中,可能所有列的内容都相同,但rowid不会相同,所以只要确定出重复记录中那些具有最大或最小rowid的就可以了,其余全部删除。
    SQL>deletefromemployeee2whererowidnotin(selectmax(e1.rowid)fromemployeee1where
    e1.emp_id=e2.emp_idande1.emp_name=e2.emp_nameande1.salary=e2.salary);--这里用min(rowid)也可以。
    SQL>deletefromemployeee2whererowid<(selectmax(e1.rowid)fromemployeee1wheree1.emp_id=e2.emp_idande1.emp_name=e2.emp_nameand
    e1.salary=e2.salary);
    (3)也是通过rowid,但效率更高。
     SQL>deletefromemployeewhererowidnotin(selectmax(t1.rowid)fromemployeet1groupby
    t1.emp_id,t1.emp_name,t1.salary);--这里用min(rowid)也可以。
    EMP_IDEMP_NAME
    SALARY
    ------------------------------------------------------------
    1sunshine
    10000
    3xyz
    30000
     2
    semon
    20000
    SQL>descemployee
    NameNull?-------------------------------------------------------------------
    Type
    emp_idemp_name
    NUMBER(10)VARCHAR2(20)
    salary
    NUMBER(10,2)
     可以通过下面的语句查询重复的记录:
    SQL>select*fromemployee;
    EMP_IDEMP_NAME
    SALARY
    ------------------------------------------------------------
    1sunshine
    10000
    1sunshine
    10000
     2semon
    20000
    2semon
    20000
    3xyz
    30000
    2semon
    20000
    SQL>selectdistinct*fromemployee;
    EMP_IDEMP_NAME
    SALARY
    ------------------------------------------------------------
     1sunshine
    10000
    2semon
    20000
    3xyz
    30000
    SQL>
    select*fromemployeegroupbyemp_id,emp_name,salaryhavingcount(*)>1
    EMP_IDEMP_NAME
    SALARY
    ------------------------------------------------------------
    1sunshine
    10000
     2semon
    20000
    SQL>select*fromemployeee1
    whererowidin(selectmax(rowid)fromemployee2wheree1.emp_id=e2.emp_idand
    e1.emp_name=e2.emp_nameande1.salary=e2.salary);
    EMP_IDEMP_NAME
    SALARY
    ------------------------------------------------------------
    1sunshine
    10000
     3xyz
    30000
    2semon
    20000
    2.删除的几种方法:
    (1)通过建立临时表来实现
    SQL>createtabletemp_empas(selectdistinct*fromemployee)
    SQL>truncatetableemployee;(清空employee表的数据)
     SQL>insertintoemployeeselect*fromtemp_emp;
    (再将临时表里的内容插回来)
    (2)通过唯一rowid实现删除重复记录.在Oracle中,每一条记录都有一个rowid,rowid在整个数据库中是唯一的,rowid确定了每条记录是在Oracle中的哪一个数据文件、行上。块、在重复的记录中,可能所有列的内容都相同,但rowid不会相同,所以只要确定出重复记录中那些具有最大或最小rowid的就可以了,其余全部删除。
    SQL>deletefromemployeee2whererowidnotin(selectmax(e1.rowid)fromemployeee1where
    e1.emp_id=e2.emp_idande1.emp_name=e2.emp_nameande1.salary=e2.salary);--这里用min(rowid)也可以。
    SQL>deletefromemployeee2whererowid<(selectmax(e1.rowid)fromemployeee1wheree1.emp_id=e2.emp_idande1.emp_name=e2.emp_nameand
    e1.salary=e2.salary);
     (3)也是通过rowid,但效率更高。
    SQL>deletefromemployeewhererowidnotin(selectmax(t1.rowid)fromemployeet1groupby
    t1.emp_id,t1.emp_name,t1.salary);--这里用min(rowid)也可以。
    EMP_IDEMP_NAME
    SALARY
    ------------------------------------------------------------
    1sunshine
    10000
     3xyz
    30000
    2semon
    20000
    本文来自CSDN博客,转载请blog.csdn.net/hedylin/archive/2005/08/29/467762.aspx
    标
    明
    出
    处
    :
    
    
设为首页 | 加入收藏 | 网学首页 | 原创论文 | 计算机原创
版权所有 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师