首页 > 其他分享 >删除重复纪录

删除重复纪录

时间:2023-09-16 17:04:20浏览次数:32  
标签:删除 重复 纪录 emp rowid SQL employee e1 e2

删除重复纪录

 

学习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


        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

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


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


        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

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


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


        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

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


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


        t1.emp_id,t1.emp_name,t1.salary);--这里用min(rowid)也可以。


 


   EMP_ID EMP_NAME                                     SALARY


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


        1 sunshine                                      10000


        3 xyz                                             30000


        2 semon                                         20000


标签:删除,重复,纪录,emp,rowid,SQL,employee,e1,e2
From: https://blog.51cto.com/u_3649463/7494483

相关文章

  • 50-集合-特点-创建和删除-交集并集差集运算
          ......
  • 45-字典-元素的添加-修改-删除
           ......
  • 35-列表-元素删除的3种方式-删除本质是数组元素拷贝
        删除和增加本质就是数组元素拷贝       ......
  • Linux 6.6 中的 SELinux 删除了 NSA 的引用
    导读SecurityEnhanced Linux (SELinux)二十年来一直是主线内核的一部分,它提供了一个实现访问控制安全策略的模块,现在广泛用于增强生产Linux服务器和其他系统的安全性。长期接触Linux的人可能不知道SELinux源自美国国家安全局(NSA)。但是现在Linux6.6中NSA的引......
  • leet code 删除有序数组中的重复项 I II
    26.删除有序数组中的重复项80.删除有序数组中的重复项II总结反思这两个题目,虽然难度程度一个是简单,一个是中等,都不是特别难。但是都没有解决。因为这两道题目都是运用双指针解决的,证明自己对双指针的掌握程度还不是很熟练。反思:为什么没有解出来?又或者,经过一段时间之后是否能够......
  • losf定位文件被那个程序打开和对误删除的文件进行恢复方法
    lsof查看文件被那个进程打开#lsof列出当前所有打开的文件[root@centos8~]#lsof|headCOMMANDPIDTIDTASKCMDUSERFDTYPEDEVICESIZE/OFFNODENAMEsystemd1rootcwdDIR8,2279......
  • 删除有序数组中的重复项 II
    题目删除有序数组中的重复项II给你一个有序数组nums,请你原地删除重复出现的元素,使得出现次数超过两次的元素只出现两次,返回删除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(1)额外空间的条件下完成。说明:为什么返回数值是整数,但输......
  • django—实现前端页面批量删除功能
    views.py代码:fromdjango.shortcutsimportrender,redirectfrom.modelsimportYourModel#使用你实际的模型名称替换defbatch_delete(request):ifrequest.method=='POST':ids=request.POST.get('ids')ifids:......
  • excel禁止输入重复数据
    禁止输入重复的数据,我们利用的功能是数据验证首先选择需要设置的数据区域,然后点击【数据】功能组找到数据验证,将【允许】设置为【自定义】随后在下方将公式设置为=COUNTIF(A:A,A4)=1,在这里A4就是第一个姓名的位置......
  • redis-删除所有key
    删除所有Key,可以使用Redis的flushdb和flushall命令//删除当前数据库中的所有Keyflushdb//删除所有数据库中的keyflushall 如果要访问Redis中特定的数据库,使用下面的命令//下面的命令指定数据序号为0,即默认数据库redis-cli-n0keys"*"|xargsredis-cli-n0del ......