查询表中重复数据

"重复记录"有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。

下面介绍第二种情况

查询是否存在重复数据

select id,count(id) from A group by id having count(id)>1

背景:oracle  表中数据有相同的id(这不是主键),但是数据是不同时间建的,想删除重复id的数据又保留最近创建的

1.查询出所有不想要的数据

select temB.*
  from (select t.*,
               t.rowid as rid,
               row_number() over(partition by id order by create_date desc) rank
          from A) temB
 where rank > 1

2.delete from A where A.rowid in (上面的查询结果)

ROWID是ORACLE中的一个重要的概念。用于定位数据库中一条记录的一个相对唯一地址值。通常情况下,该值在该行数据插入到数据库表时即被确定且唯一。ROWID它是一个伪列,它并不实际存在于表中。它是ORACLE在读取表中数据行时,根据每一行数据的物理地址信息编码而成的一个伪列。所以根据一行数据的ROWID能找到一行数据的物理地址信息。从而快速地定位到数据行。数据库的大多数操作都是通过ROWID来完成的,而且使用ROWID来进行单记录定位速度是最快的。

要理解索引,必须先搞清楚ROWID。

原文地址:https://www.cnblogs.com/leavesss/p/10630403.html