SQL中重复数据的查询与删除

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

SQL中重复数据的查询与删除========第一篇=========在一张表中某个字段下面有重复记录,有很多方法,但是有一个方法,是比较高效的,如下语句:selectdata_guidfromadam_entity_datasawherea.rowid(selectmin(b.rowid)fromadam_entity_datasbwhereb.data_guid=a.data_guid)如果表中有大量数据,但是重复数据比较少,那么可以用下面的语句提高效率selectdata_guidfromadam_entity_dataswheredata_guidin(selectdata_guidfromadam_entity_datasgroupbydata_guidhavingcount(*)1)此方法查询出所有重复记录了,也就是说,只要是重复的就选出来,下面的语句也许更高效selectdata_guidfromadam_entity_dataswhererowidin(selectridfrom(selectrowidrid,row_number()over(partitionbydata_guidorderbyrowid)mfromadam_entity_datas)wherem1)目前只知道这三种比较有效的方法。第一种方法比较好理解,但是最慢,第二种方法最快,但是选出来的记录是所有重复的记录,而不是一个重复记录的列表,第三种方法,我认为最好。========第二篇=========selectusercode,count(*)fromptypegroupbyusercodehavingcount(*)1========第三篇=========找出重复记录的ID:selectIDfrom(selectID,count(*)asCntfrom要消除重复的表groupbyID)T1whereT1.cnt1删除数据库中重复数据的几个方法数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置……方法一declare@maxinteger,@idintegerdeclarecur_rowscursorlocalforselect主字段,count(*)from表名groupby主字段havingcount(*)1opencur_rowsfetchcur_rowsinto@id,@maxwhile@@fetch_status=0beginselect@max=@max-1setrowcount@maxdeletefrom表名where主字段=@idfetchcur_rowsinto@id,@maxendclosecur_rowssetrowcount0方法二有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。1、对于第一种重复,比较容易解决,使用selectdistinct*fromtableName就可以得到无重复记录的结果集。如果该表需要删除重复的记录,可以按以下方法删除selectdistinct*into#TmpfromtableNamedroptabletableNameselect*intotableNamefrom#Tmpdroptable#Tmp2、这类重复问题通常要求保留重复记录中的第一条记录,*作方法如下假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集selectidentity(int,1,1)asautoID,*into#TmpfromtableNameselectmin(autoID)asautoIDinto#Tmp2from#TmpgroupbyName,autoIDselect*from#TmpwhereautoIDin(selectautoIDfrom#tmp2)最后一个select即得到了Name,Address不重复的结果集更改数据库中表的所属用户的两个方法大家可能会经常碰到一个数据库备份还原到另外一台机器结果导致所有的表都不能打开了,原因是建表的时候采用了当时的数据库用户……========第四篇=========如何查询数据库中的重复记录?比如说有个表中的数据是这样:---------aaabbc---------查询出的结果是:记录数量a3b2c1怎样写这个SQL语句?-----------------------selectdistinct(name),count(*)fromtabnamegroupbyname;-------------------------------------想出来了,这样就可以排序了。selecta1,count(a1)astotalfromtablenamegroupbya1orderbytotaldesc--------------------------------------selectdistinct(a1),count(a1)astotalfromtablenamegroupbya1orderbytotaldesc加个distinct更有效率--------------------------------------------------------------selectp.*,m.*fromtable1pleftjointable2monp.item1=m.item2wherep.item3='#$#@%$@'orderbyp.item3asclimit10就类似这么写========第五篇=========如何查找数据库中的重复记录?能在Access中用的方法----------------------------------------------------------------------select*from表Ainnerjoin(select字段1,字段2from表groupby字段1,字段2havingCount(*)1)BonA.字段1=B.字段1andA.字段2=B.字段2--------------------------------------------------------问题:根据其中几个字段判断重复,只保留一条记录,但是要显示全部字段,怎么查询,谢谢!!比如字段1字段2字段3字段4abc1abc1abd2abd3bbd2想得到的结果为abc1abd2(或者3)bbd2说明,根据字段1,2,3组合不重复,字段4不考虑,得到了3个记录但是也要显示字段4。方法一:可以用临时表的方法来解决:CurrentProject.Connection.ExecutedroptabletemptableCurrentProject.Connection.Executeselect*intotemptablefrom表2where1=2CurrentProject.Connection.Executeinsertintotemptable(字段1,字段2,字段3)SELECTDISTINCT表2.字段1,表2.字段2,表2.字段3FROM表2;CurrentProject.Connection.ExecuteUPDATEtemptableINNERJOIN表2ON(表2.字段1=temptable.字段1)AND(表2.字段2=temptable.字段2)AND(表2.字段3=temptable.字段3)SETtemptable.字段4=[表2].[字段4];方法二:可以直接使用一个SELECT查询筛选出需要的数据:可以假定第四字段都选值最小的SELECT[1],[2],[3],Min([4])ASMin4FROM表1GROUPBY表1.[1],表1.[2],表1.[3];问题:表2idNAMEr1r211wee11112321212312312124341212312321123123ID为数值,NAME为字符。每条记录没有唯一标识。要求取得ID和NAME合并后不重复的记录,如有重复保留其中一条即可,但要显示所有记录。回答:SELECTa.*,(selecttop1r1from表2asa1wherea1.id=a.idanda1.name=a.name)ASr1,(selecttop1r2from表2asa2wherea2.id=a.idanda2.name=a.name)ASr2FROM[SELECTDISTINCT表2.id,表2.NAMEFROM表2].ASa;SELECTa.*,dlookup(r1,表2,id=&a.id&andname='&a.name&')ASr1,dlookup(r2,表2,id=&a.id&andname='&a.name&')ASr2FROM[SELECTDISTINCT表2.id,表2.NAMEFROM表2].ASa;注意,上述代码中由于没有唯一标识列,因此显示的R1R2的先后次序无从确定,一般是按输入的先后顺序,但是微软没有官方资料说明到底按哪个顺序,请网友注意。请注意,上述表2为没有唯一标识字段,如果现在再建立一个自动编号字段“主键”则可以用以下代码SELECTa.ID,a.name,b.r1,b.r2,b.主键FROM(SELECT表2.id,表2.NAME,Min(表2.主键)AS主键FROM表2GROUPBY表2.id,表2.NAME)ASainnerJOIN表2ASbONa.主键=b.主键;========第六篇=========1.查询数据库中重复的记录:selectrealname,count(*)fromusersgroupbyrealnamehavingcount(*)1========第七篇=========SELECTT0.ItemCode,T0.ItemNameFROMOITMT0WHEREexists(select1fromOITMAwhereA.CODEBARS=TO.CODEBARSAndA.ItemCodeTO.ItemCode)========第八篇=========相信很多人在查询数据库时都会碰到检索某表中不重复记录的时候,提到检索不重复记录,马上想到的肯定是Distinct或者GroupBy分组,小弟在初次使用的时候碰到了一些麻烦,这里拿出来与大家分享,希望对更多的朋友有所帮助!先看看数据库表结构:表名:TEST字段:Id,A,B,C,D其中B字段包含重复值;IdABCD111a34bvb222a35fgfg333dhtsdf444a345de555csfsfsscv666brtfg下面我们来看看用什么样的SQL语句检索出不含重复记录的数据:使用Distinct关键字Distinct关键字主要用来在SELECT查询记录中根据某指定字段的值去除重复记录SELECTDISTINCT[字段名]FROM[表名]WHERE[检索条件字句]所以用这样一句SQL就可以去掉重复项了:[color=]SELECTDISTINCT(B)FROMTEST但是:这里有一个非常非常需要注意的地方:SELECTDISTINCT[字段名]后面不能再跟其他的字段,否则检索出来的记录仍然会含有重复项;错误写法:SELECTDISTINCT[字段名],[其他字段名]FROM[表名]WHERE[检索条件字句]实际上,我们上面SQL语句结果集里就只有B字段;(一般情况下,这种结果应该是很难满足需求的)如果我们的记录集里还需要有其他字段值,那怎么办呢?实际上,我们完全可以用另一种办法来解决问题;只是需要用到子查询而已!使用GROUPBY分组有一点需要注意:使用带有GROUPBY字句的查询语句时,在SELECT列表指定的列要么是GROUPBY指定的列,要么包含聚合组函数所以用这样一句SQL就可以去掉重复项了:[color=]SELECT*FR

1 / 16
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功