如何查找数据库中的重复数据

如何查找数据库中的重复数据,第1张

实现方式如下:

  Dim cnn As Object, rs As Object, SQL$, i&, s$

    Set cnn = CreateObject("ADODBConnection")

    cnnOpen "Provider=MicrosoftJetOledb40;data Source=" & ThisWorkbookPath & "\排课数据mdb"

    SQL = "Select 星期&节&班级,count(星期&节&班级) from 排课 where 星期 is not null group by 星期&节&班级 having count(星期&节&班级)>1"

    Set rs = CreateObject("ADODBRecordset")

    rsOpen SQL, cnn, 1, 3

    If rsRecordCount Then

        For i = 1 To rsRecordCount

            s = s & vbCrLf & "星期" & rsFields(0) & "班,重复次数:" & rsFields(1)

            rsMoveNext

        Next

        MsgBox "有" & rsRecordCount & "条记录重复:" & s

    Else

        MsgBox "没有发现重复记录"

    End If

    rsClose

    cnnClose

    Set rs = Nothing

    Set cnn = Nothing

End Sub

1。删除全部重复记录(慎用) 

Delete表Where重复字段In(Select重复字段From表GroupBy重复字段HavingCount()>1)

2。保留一条(这个应该是大多数人所需要的^_^)

DeleteHZTWhereIDNotIn(SelectMax(ID)FromHZTGroupByTitle)

注:此处保留ID最大一条记录

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

selectfromvitaea

where(apeopleId,aseq)in(selectpeopleId,seqfromvitaegroupbypeopleId,seqhavingcount()>1)

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

deletefromvitaea

where(apeopleId,aseq)in(selectpeopleId,seqfromvitaegroupbypeopleId,seqhavingcount()>1)

androwidnotin(selectmin(rowid)fromvitaegroupbypeopleId,seqhavingcount()>1)

首先是将数据库里边的重复记录删掉,我看网上有好多答案是这样的:

1 delete from people

2 where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1)

3 and rowid not in (select min(rowid) from people group by peopleId having count(peopleId )>1)

但其实我每次运行这条语句都是行不通的,会报错:

SQL 错误 [1093] [HY000]: You can't specify target table 'test1' for update in FROM clause

javasqlSQLException: You can't specify target table 'test1' for update in FROM clause

去网上查过好像是说update以及delete *** 作没办法跟查询 *** 作一起做的,我看过有的更新的跟查询的一起做的好像是给查出来的那部分起个别名,然后进行更新就可以了,但是删除这个我起了别名也不对,不知道是我写错还是不行,我就跳过这个方法了。

我用的方法是:先查出数据库中的重复记录的数据中的一条,这个不难,很简单的,sql语句如下:

select from test1 where name in (select  name from test1  group  by  name   having  count(name) > 1)

and id in (select min(id) from  test1  group by name  having count(name)>1)

结果如下:

id |name |phont |

---|--------|-------|

1 |name22 |123 |

3 |name222 |123 |

5 |name2 |123123 |

8 |123 |123123 |

11 |name1 |123123 |

13 |111 |1231 |

14 |112 |1232 |

这些都是不重复的,换句话说都是要保留的,不被删掉的,而其余与这些结果中name相同的应该被删掉。

也就是说将上边那个sql语句id后边加一个not ,查出来的结果就是要删掉的:结果如下

id |name |phont |

---|--------|-------|

2 |name22 |123 |

4 |name222 |123 |

6 |name2 |123123 |

7 |name2 |NULL |

9 |123 |123123 |

10 |123 |123123 |

12 |name1 |123123 |

15 |111 |1233 |

16 |112 |1234 |

17 |111 |1235 |

18 |112 |1236 |

我把这些需要删掉的存到另外一个表里,然后我新建一个test2表,结构复制test1的结构就好了

1 CREATE TABLE `test2` (2   `id` int(11) NOT NULL AUTO_INCREMENT,3   `name` varchar(50) DEFAULT NULL,4   `phont` varchar(50) DEFAULT NULL,5   PRIMARY KEY (`id`)6 ) ENGINE=InnoDB DEFAULT CHARSET=utf8

然后插入语句是:

1 insert into test2(2 select from testtest1 where name in (select  name from testtest1  group  by  name   having  count(name) > 1)

3 and id not in (select min(id) from  testtest1  group by name  having count(name)>1)

4 )

然后test2的表里的数据就是下图这样的:

那接下来做的就是删掉test1表里边与test2表的id相同的数据。

1 delete a from test1 a, test2 b where aid = bid ;

这样,test1里边的数据就变成了:

这样的结果就是完全不重复的,但是我还想要他们的id是连续的,而不是这样的断开的。

我的做法是将这个表的除掉id之外的所有字段查出插入到另外一个表test3中,当然,test3要设置id为自增主键,但是不插入id,让它自增,就连续了

当然要新建表test3啦,不过把上边新建的test2那个复制下来改名字为test3就好啦。

然后插入:

1 insert into test3(name, phont)2 (select name, phont from test2)

test3表里的结果就是:

这样就可以把test3改成你想要的名字,然后删掉test1和test2了,大功告成~

不过感觉还可以就是将已经删掉重复数据的表test1的数据全都导出来,一般的数据库连接工具都有这样的功能,导成sql格式的,然后新建一个表,比test1多增一个自增主键字段叫NewId字段,但是Id字段不能再自增了,然后将导成的sql文件导入,不过那个sql文件可能要编辑一下,改一下自增主键id变为普通的字段什么的,然后到新表了之后,删掉id字段,修改NewId为Id,应该也可以,但是这个方法我没试过,原先预想过要这么做但是没有这么做,估计以后可以试试,但是感觉两种的麻烦程度都差不多啊,但是如果将sql语句写下来之后可能还是第一种方法比较快一点吧。

MYSQL里有五百万数据,但大多是重复的,真实的就180万,于是想怎样把这些重复的数据搞出来,在网上找了一圈,好多是用NOT IN这样的代码,这样效率很低,自己琢磨组合了一下,找到一个高效的处理方式,用这个方式,五百万数据,十来分钟就全部去除重复了,请各位参考。

第一步:从500万数据表data_content_152里提取出不重复的字段SFZHM对应的ID字段到TMP3表

1 create table tmp3 as select min(id) as col1 from data_content_152 group by SFZHM;

第二步:创建新表RES

1234 CREATE TABLE `res` (`id` int(11),`sfz` char(20)) ENGINE=MyISAM;

第三步:把TMP3表ID对应到data_content_152里需要提取的数据添加到RES表的SFZ字段

1 INSERT INTO res (sfz) SELECT sfzhm FROM data_content_152,tmp3 where data_content_152id=tmp3col1

至此,就在MYSQL里实现了,给数据表data_content_152完全删除重复数据,把去重复后的数据导入到RES表。

方法很多,说一个最简单的。

先建一个表,结构和原来的表一样,但是在你要去重的列建立一个主键,并设置“忽略重复键”,把原表中的所有数据插入这个新表,

此时新表中的数据就已经是非重复的了。

把原表数据都删掉,把新表中的数据都导回来就ok了

Oracle数据库重复的数据一般有两种去重方法,一、完全重复数据去重;二、部分字段数据重复去重。

一、完全重复数据去重方法

对于表中完全重复数据去重,可以采用以下SQL语句。

Code

CREATETABLE"#temp"AS (SELECTDISTINCT FROM 表名);--创建临时表,并把DISTINCT 去重后的数据插入到临时表中

truncateTABLE 表名;--清空原表数据

INSERTINTO 表名(SELECT FROM"#temp");--将临时表数据插入到原表中

DROPTABLE"#temp";--删除临时表

具体思路是,首先创建一个临时表,然后将DISTINCT之后的表数据插入到这个临时表中;然后清空原表数据;再讲临时表中的数据插入到原表中;最后删除临时表。

二、部分数据去重方法

首先查找重复数据

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

将上面的>号改为=号就可以查询出没有重复的数据了。

想要删除这些重复的数据,可以使用下面语句进行删除:

deletefrom 表名 a where 字段1,字段2 in

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

oracle产品服务

甲骨文公司产品主要有以下几类:

甲骨文股份有限公司

1服务器及工具

数据库服务器:2013年最新版本Oracle 12C。

应用服务器:Oracle Application Server。

开发工具:OracleJDeveloper,Oracle Designer,Oracle Developer,等等。

2企业应用软件

企业资源计划(ERP)软件。已有10年以上的历史。2005年,并购了开发企业软件的仁科软件公司(PeopleSoft)以增强在这方面的竞争力。

客户关系管理(CRM)软件。自1998年开始研发这种软件。2005年,并购了开发客户关系管理软件的希柏软件公司(Siebel)。

3 Oracle职业发展力计划(Oracle WDP)

Oracle WDP 全称为Oracle Workforce Development Program,是Oracle (甲骨文)公司专门面向学生、个人、在职人员等群体开设的职业发展力课程。Oracle的技术广泛应用于各行各业,其中电信、电力、金融、政府及大量制造业都需要Oracle技术人才,Oracle公司针对职业教育市场在全球推广的项目,其以低廉的成本给这部分人群提供Oracle技术培训,经过系统化的实训,让这部分人群能够迅速掌握Oracle最新的核心技术,并能胜任企业大型数据库管理、维护、开发工作。

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

1、对于第一种重复,比较容易解决,使用

select distinct from tableName

就可以得到无重复记录的结果集。

如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除

复制代码代码如下:

select distinct into #Tmp from tableName

drop table tableName

select into tableName from #Tmp

drop table #Tmp

发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。

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

假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集

复制代码代码如下:

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)

有两个意义上的重复记录

①完全重复的记录,也即所有字段均重复的记录。

②部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。

1、对于第一种重复,比较容易解决,使用

select distinct  from tableName

这样就可以得到无重复记录的结果集。然后通过临时表实现对数据的维护。

select distinct  into #Tmp from tableName

drop table tableName

select  into tableName from #Tmp

drop table #Tmp

#Tmp为什么系统参数,tableName为要 *** 作的表名。

2、第二类重复问题通常要求保留重复记录中的第一条记录, *** 作方法如下:

假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集

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即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)

以上就是关于如何查找数据库中的重复数据全部的内容,包括:如何查找数据库中的重复数据、mysql 如何删除重复的数据、怎么删除重复的Mysql数据等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/10195893.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-06
下一篇2023-05-06

发表评论

登录后才能评论

评论列表(0条)

    保存