Oracle 删除重复数据只留一条

Oracle 删除重复数据只留一条
强烈推介IDEA2020.2破解激活,IntelliJ IDEA 注册码,2020.2 IDEA 激活码
  •  效率低
查询及删除重复记录的SQL语句
 
1、查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断
 
select * from 表 where Id in (select Id from 表 group byId having count(Id) > 1)
 
2、删除表中多余的重复记录,重复记录是根据单个字段(Id)来判断,只留有rowid最小的记录
 
DELETE from 表 WHERE (id) IN ( SELECT id FROM 表 GROUP BY id HAVING COUNT(id) > 1) AND ROWID NOT IN (SELECT MIN(ROWID) FROM 表 GROUP BY id HAVING COUNT(*) > 1);
 
3、查找表中多余的重复记录(多个字段)
 
select * from 表 a where (a.Id,a.seq) in(select Id,seq from 表 group by Id,seq having count(*) > 1)
 
4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录
 
delete from 表 a where (a.Id,a.seq) in (select Id,seq from 表 group by Id,seq having count(*) > 1) and rowid not in (select min(rowid) from 表 group by Id,seq having count(*)>1)
 
5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录
 
select * from 表 a where (a.Id,a.seq) in (select Id,seq from 表 group by Id,seq having count(*) > 1) and rowid not in (select min(rowid) from 表 group by Id,seq having count(*)>1)
  •  效率高(推荐)
1.oracle中怎么不用distinct查找不重复记录,users表有字段userid,username,password?

答:

第一种方法:

select userid,username,password from users group by userid,username,password;

使用group by 给表记录的所有字段组合分组显示,如果有相同的记录则就显示其中一条。

第二种方法:

select * from users u1 where u1.rowid =
(select min(u2.rowid) from users u2 where u1.userid = u2.userid);

子查询找出某用户(不同记录对应不同用户,相同记录的则是同一用户)最低的ROWID(肯定只有一个),然后使外围的rowid等于子查询查出的这个代表某一用户的最低rowid,即可查到不重复的记录。

 

2.oracle怎么去除删除表中的重复记录,users表有字段userid,username,password?

答:

delete from users u1 where u1.rowid >
(select min(u2.rowid) from users u2 where u1.userid = u2.userid)

1、子查询找出某员工最低的ROWID(肯定只有一个),其它大于这条记录ROWID的,全部删除。

2、Oracle中使用ROWID删除重复记录最快,因为Rowid对应这条记录在磁盘上的位置

 

本文来源huayang183,由架构君转载发布,观点不代表Java架构师必看的立场,转载请标明来源出处:https://javajgs.com/archives/18554

发表评论