一、背景
一张person表,有id和name的两个字段,id是唯一的不允许重复,id相同则认为是重复的记录。
二、解决
select id from group by id having count(*) > 1
按照id分组并计数,某个id号那一组的数量超过1条则认为重复。
如何查询重复的数据

select字段1,字段2,count(*)from表名groupby字段1,字段2havingcount(*) > 1

PS:将上面的>号改为=号就可以查询出没有重复的数据了。
Oracle删除重复数据的SQL(删除所有):
删除重复数据的基本结构写法:
想要删除这些重复的数据,可以使用下面语句进行删除

deletefrom表名 awhere字段1,字段2in
(select字段1,字段2,count(*)from表名groupby字段1,字段2havingcount(*) > 1)

上面的SQL注意:语句非常简单,就是将查询到的数据删除掉。不过这种删除执行的效率非常低,对于大数据量来说,可能会将数据库吊死。
建议先将查询到的重复的数据插入到一个临时表中,然后对进行删除,这样,执行删除的时候就不用再进行一次查询了。如下:
CREATE TABLE 临时表 AS (select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1)
上面这句话就是建立了临时表,并将查询到的数据插入其中。
下面就可以进行这样的删除操作了:

deletefrom表名 awhere字段1,字段2in(select字段1,字段2from临时表);

Oracle删除重复数据
的SQL(留下一条记录):
oracle中,有个隐藏了自动rowid,里面给每条记录一个唯一的rowid,我们如果想保留最新的一条记录,我们就可以利用这个字段,保留重复数据中rowid最大的一条记录就可以了。
使用ROWID查询重复数据:

selecta.rowid,a.*from表名 a
wherea.rowid !=
(selectmax(b.rowid)from表名 b
wherea.字段1 = b.字段1and
a.字段2 = b.字段2 )

括号中的SQL查询出rowid最大的记录,而外面就是查询出除了rowid最大之外的其他重复的数据了。
由此,我们要删除重复数据,只保留最新的一条数据,就可以这样写了:
删除重复数据(留下最大ROWID的一条)

deletefrom表名 awherea.rowid !=
(selectmax(b.rowid)from表名 b
wherea.字段1 = b.字段1and
a.字段2 = b.字段2 )

删除重复数据(留下最小ROWID的一条)

deletetab twheret.rowid > (
selectmin(t2.rowid)fromtab t2wheret.col2 = t2.col2andt.col8 = t2.col8

当然,上面语句的执行效率是很低的,可以考虑建立临时表,讲需要判断重复的字段、rowid插入临时表中,然后删除的时候在进行比较。

createtable临时表asselecta.字段1,a.字段2,MAX(a.ROWID) dataidfrom正式表 aGROUPBYa.字段1,a.字段2;
deletefrom表名 a
wherea.rowid !=
(selectb.dataidfrom临时表 b
wherea.字段1 = b.字段1and
a.字段2 = b.字段2 );
commit;

对于完全重复记录的删除
对于表中两行记录完全一样的情况,可以用下面语句获取到去掉重复数据后的记录:

selectdistinct*from表名

可以将查询的记录放到临时表中,然后再将原来的表记录删除,最后将临时表的数据导回原来的表中。如下:

CREATETABLE临时表AS(selectdistinct*from表名);
truncatetable正式表;
insertinto正式表 (select*from临时表);
droptable临时表;

如果想删除一个表的重复数据,可以先建一个临时表,将去掉重复数据后的数据导入到临时表,然后在从临时表将数据导入正式表中,如下:

INSERTINTOt_table_bak
selectdistinct*fromt_table;

MySQL查询及删除重复记录的方法
查询及删除重复记录的方法(例子演示)
1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断

select*fromtablewheretableIdin(selecttableIdfromtablegroupbytableIdhavingcount(tableId) > 1)

2、删除表中多余的重复记录,重复记录是根据单个字段(tableId)来判断,只留有rowid最小的记录。

deletefromtablewheretableIdin(selecttableIdfromtablegroupbytableIdhavingcount(tableId) > 1)androwidnotin(selectmin(rowid)fromtablegroupbytableIdhavingcount(tableId )>1)

3、查找表中多余的重复记录(多个字段)

select*fromvitae awhere(a.tableId,a.seq)in(selecttableId,seqfromvitaegroupbytableId,seqhavingcount(*) > 1)

4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录

deletefromvitae awhere(a.tableId,a.seq)in(selecttableId,seqfromvitaegroupbytableId,seqhavingcount(*) > 1)
androwidnotin(selectmin(rowid)fromvitaegroupbytableId,seqhavingcount(*)>1)

5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录

select*fromvitae awhere(a.tableId,a.seq)in(selecttableId,seqfromvitaegroupbytableId,seqhavingcount(*) > 1)androwidnotin(selectmin(rowid)fromvitaegroupbytableId,seqhavingcount(*)>1)

6、查询出一个表中,某一列的值是相同的SQL:
比方说
在A表中存在一个字段“name”,而且不同记录之间的“name”值有可能会相同,
现在就是需要查询出在该表中的各记录之间,“name”值存在重复的项;

SelectName,Count(*)FromAGroupByNameHavingCount(*) > 1

如果还查性别也相同大则如下:

SelectName,sex,Count(*)FromAGroupByName,sexHavingCount(*) > 1

oracle查询表中字段里数据是否有重复
查单个字段:

SELECTTEST_NAME,COUNT(*)FROMT_TESTGROUPBYTEST_NAMEHAVINGCOUNT(*) > 1

Oracle查询重复数据并删除,只保留一条记录
1、查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断

select
*from表whereIdin(selectIdfrom表groupbyIdhavingcount(Id) >

2、删除表中多余的重复记录,重复记录是根据单个字段(Id)来判断,只留有rowid最小的记录

DELETE
from表WHERE(id)IN(SELECTidFROM表GROUPBYidHAVINGCOUNT(id) > 1)AND
ROWIDNOTIN(SELECTMIN(ROWID)FROM表GROUPBYidHAVINGCOUNT(*) >
1);

3、查找表中多余的重复记录(多个字段)

select
*from表awhere(a.Id,a.seq)in(selectId,seqfrom表groupbyId,seqhaving
count(*) > 1)

4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录

delete
from表awhere(a.Id,a.seq)in(selectId,seqfrom表groupbyId,seqhaving
count(*) > 1)androwidnotin(selectmin(rowid)from表groupbyId,seq
havingcount(*)>1)

5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录

select
*from表awhere(a.Id,a.seq)in(selectId,seqfrom表groupbyId,seqhaving
count(*) > 1)androwidnotin(selectmin(rowid)from表groupbyId,seq
havingcount(*)>1)

比如现在有一人员表 (表名:peosons)
若想将姓名、身份证号、住址这三个字段完全相同的记录查询出来

selectp1.*
frompersons p1,persons p2
wherep1.id