# oracle查询重复数据与删除重复记录方法

select p1.*
from persons p1,persons p2
where p1.id<>p2.id
and  p1.cardid = p2.cardid and p1.pname = p2.pname and p1.address = p2.address

1.用rowid方法

2.用group by方法

3.用distinct方法

1。用rowid方法

select * from table1 a where rowid !=(select max(rowid)
from table1 b where a.name1=b.name1 and a.name2=b.name2......)

delete  from table1 a where rowid !=(select max(rowid)
from table1 b where a.name1=b.name1 and a.name2=b.name2......)

2.group by方法

select count(num), max(name) from student --列出重复的记录数，并列出他的name属性
group by num
having count(num) >1 --按num分组后找出表中num列重复，即出现次数大于一次

delete from student
group by num
having count(num) >1

3.用distinct方法 -对于小的表比较有用

create table table_new as   select distinct *   from table1 minux
truncate table table1;
insert into table1 select * from table_new;

1、查找表中多余的重复记录，重复记录是根据单个字段（peopleId）来判断
select * from people
where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1)

2、删除表中多余的重复记录，重复记录是根据单个字段（peopleId）来判断，只留有rowid最小的记录
delete from people
where peopleId in (select peopleId from people group by peopleId
having count(peopleId) > 1)
and rowid not in (select min(rowid) from people group by peopleId having count(peopleId )>1)

3、查找表中多余的重复记录（多个字段）
select * from vitae a
where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)

4、删除表中多余的重复记录（多个字段），只留有rowid最小的记录
delete from vitae a
where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)

5、查找表中多余的重复记录（多个字段），不包含rowid最小的记录
select * from vitae a
where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)

(二)

Select Name,Count(*) From A Group By Name Having Count(*) > 1

Select Name,sex,Count(*) From A Group By Name,sex Having Count(*) > 1

(三)

declare @max integer,@id integer
declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) >； 1
open cur_rows
fetch cur_rows into @id,@max
while @@fetch_status=0
begin
select @max = @max -1
set rowcount @max
delete from 表名 where 主字段 = @id
fetch cur_rows into @id,@max
end
close cur_rows
set rowcount 0

＂重复记录＂有两个意义上的重复记录，一是完全重复的记录，也即所有字段均重复的记录，二是部分关键字段重复的记录，

1、对于第一种重复，比较容易解决，使用
select distinct * from tableName就可以得到无重复记录的结果集。

select distinct * into #Tmp from tableName
drop table tableName
select * into tableName from #Tmp
drop table #Tmp

2、这类重复问题通常要求保留重复记录中的第一条记录，操作方法如下

select identity(int,1,1) as autoID, * into #Tmp from tableName
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID
select * from #Tmp where autoID in(select autoID from #tmp2)

(四)

select * from tablename where id in (
select id from tablename
group by id
having count(id) > 1
)
• 本文已收录于以下专栏：

## 查询同一表内多字段同时重复记录的SQL语句

• jodan179
• 2014年05月10日 15:26
• 711

## ORACLE查询删除重复记录三种方法

• qiu_x_b
• 2016年11月04日 15:34
• 3440

## oracle查询重复数据方法

SQL重复记录查询方法 2008年08月14日 星期四 21:01 SQL重复记录查询 1、查找表中多余的重复记录，重复记录是根据单个字段（peopleId）来判断 sel...
• Mick_Yang
• 2014年01月16日 10:22
• 30629

## MySQL之——查询重复记录、删除重复记录方法大全

• l1028386804
• 2016年06月22日 13:30
• 28485

## oracle 查询重复数据并且删除, 只保留一条数据

• u010069853
• 2016年12月08日 14:38
• 11827

## 如何查询oracle数据库表中的重复记录

• zj511025
• 2007年09月05日 15:37
• 1842

## Oracle查询重复数据与删除重复记录方法

Oracle 删除重复数据只留一条 查询及删除重复记录的SQL语句   1、查找表中多余的重复记录，重复记录是根据单个字段（Id）来判断   select * from ...
• Mydwr
• 2013年08月23日 16:41
• 515

## ORALCE 取出重复的数据记录

• chaiqi
• 2007年01月19日 14:06
• 2431

## SQL查询重复数据和清除重复数据

• rockyvan
• 2008年05月20日 11:03
• 63765

## oracle 删除表中重复记录

oracle 删除表中重复记录
• qq_34117825
• 2016年06月30日 14:11
• 917

举报原因： 您举报文章：oracle查询重复数据与删除重复记录方法 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)