sql数据库一些查找删除方法_第1页
sql数据库一些查找删除方法_第2页
sql数据库一些查找删除方法_第3页
sql数据库一些查找删除方法_第4页
sql数据库一些查找删除方法_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、查找数据库中重复数据T-SQL=第一篇= 在一张表中某个字段下面有重复记录,有很多方法,但是有一个方法,是比较高 效的,如下语句:select data_guid from adam_entity_datas a where a.rowid (select min (b.rowid) from adam_entity_datas b where b.data_guid = a.data_guid) 如果表中有大量数据,但是重复数据比较少,那么可以用下面的语句提高效率 select data_guid from adam_entity_datas where data_guid in (sele

2、ct da ta_guid from adam_entity_datas group by data_guid having count(*) 1)此方法查询出所有重复记录了,也就是说,只要是重复的就选出来,下面的语句 也许更高效select data_guid from adam_entity_datas where rowid in (select rid fr om (select rowid rid,row_number()over(partition by data_guid order by rowid) m from adam_entity_datas) where m 1)目前

3、只知道这三种比较有效的方法。第一种方法比较好理解,但是最慢,第二种方法最快,但是选出来的记录是所有 重复的记录,而不是一个重复记录的列表,第三种方法,我认为最好。=第二篇=select usercode,count(*) from ptype group by usercode h aving count(*) 1=第三篇=找出重复记录的ID:select ID from(select ID ,count(*) as Cntfrom要消除重复的表group by ID) T1where Tt1 删除数据库中重复数据的几个方法数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重 复数据导

4、致了数据库部分设置不能正确设置方法一declare max integer,id integerdeclare cur_rows cursor local for select 主字段,count(*) from表名 group by 主字段 having count(*) 1open cur_rowsfetch cur_rows into id,maxwhile fetch_status=0beginselect max = max -1set rowcount maxdelete from 表名 where 主字段=idfetch cur_rows into id,maxendclose

5、cur_rowsset rowcount 0方法二有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录, 二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或 都重复可以忽略。1、对于第一种重复,比较容易解决,使用select distinct * from tableName就可以得到无重复记录的结果集。如果该表需要删除重复的记录,可以按以下方法删除select distinct * into #Tmp from tableNamedrop table tableNameselect * into tableName from #Tmpdrop table

6、 #Tmp2、这类重复问题通常要求保留重复记录中的第一条记录,*作方法如下假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集select identity(int,1,1) as autolD, * into #Tmp fromtableNameselect min(autoID) as autoID into #Tmp2 from #Tmp group byName,autoIDselect * from #Tmp where autoID in(select autoID from#tmp2)最后一个select即得到了 Name,Address不重复的结果集更改数

7、据库中表的所属用户的两个方法大家可能会经常碰到一个数据库备份还原到另外一台机器结果导致所有的表都不能打开了,原因是建表的时候采用了当时的数据库用户=第四篇=如何查询数据库中的重复记录?比如说有个表中的数据是这样: aaab查询出的结果是:记录数量 TOC o 1-5 h z a3b2c1怎样写这个SQL语句?select distinct(name),count(*) from tabname group by name;想出来了,这样就可以排序了。select a1,count(a1) as total from tablename group by a1 order by to tal d

8、esc select distinct(a1),count(a1) as total from tablename group by a1 ord er by total desc加个distinct更有效率 select p.*, m.* from table1 p left join table2 m on p.item1=m.item2 where p.item3=#$#%$ order by p.item3 asc limit 10就类似这么写=第五篇=如何查找数据库中的重复记录?能在Access中用的方法 select *from 表 A inner join (select 字段

9、1,字段 2 from 表 group by 字段 1,字段2 having Count(*)1) B on A.字段 1=B.字段 1 and A.字段 2=B.字段 2问题: 根据其中几个字段判断重复,只保留一条记录,但是要显示全部字段,怎么查询,谢谢!比如字段1字段2字段3字段4abc1abc1abd2abd3bbd2想得到的结果为2 (或者3)说明根据字段12,3组合不重复,字段4不考虑,得到了 3个记录但是也要显示字段4。方法一: 可以用临时表的方法来解决:CurrentProject.Connection.Execute drop table temptableCurrentPro

10、ject.Connection.Execute select * into temptable from 表 2 where 1=2CurrentProject.Connection.Execute insert into temptable (字段 1,字段 2, 字段3) SELECT DISTINCT表2.字段1,表2.字段2,表2.字段3 FROM表2;CurrentProject.Connection.Execute UPDATE temptable INNER JOIN 表 2 ON (表 2.字段 1 = temptable.字段 1) AND (表 2.字段 2 = tempt

11、able.字段 2)AND (表 2.字段 3 = temptable.字段 3) SET temptable.字段 4 =表 2.字段4;方法二可以直接使用一个SELECT查询筛选出需要的数据:可以假定第四字段都选值最小的SELECT 1,2, 3, Min(4) AS Min4FROM 表 1GROUP BY 表 1.1,表 1.2,表 1.3;问题:表2id NAME r1r211wee11112321212312312124341212312321123123ID为数值,NAME为字符。每条记录没有唯一标识。要求取得ID和NAME合并后不重复的记录,如有重复保留其中一条即可,但要显示所

12、有记录。回答:SELECT a.*, (select top 1 r1 from 表 2 as al where al.id=a.id and 二) AS r1, (select top 1 r2 from 表 2 as a2 where a2.id=a.idand 二) AS r2FROM SELECT DISTINCT 表 2.id,表 2.NAMEFROM 表 2. AS a;SELECT a.*, dlookup(r1,表 2,id= & a.id & and name=& & )AS r1, dlookup(r2,表

13、2,id= & a.id & and name=& & )AS r2FROM SELECT DISTINCT 表 2.id,表 2.NAMEFROM 表 2. AS a;注意,上述代码中由于没有唯一标识列,因此显示的R1 R2的先后次序无从确 定,一般是按输入的先后顺序,但是微软没有官方资料说明到底按哪个顺序,请 网友注意。请注意,上述表2为没有唯一标识字段,如果现在再建立一个自动编号字段“主 键”则可以用以下代码SELECT a.ID, , b.rl, b.r2, b.主键FROM (SELECT 表 2.id,表 2.NAME, Min(表 2.主键)AS 主键F

14、ROM 表 2GROUP BY 表 2.id,表 2.NAME) AS a inner JOIN 表 2 AS b ON a.主键二b.主 键;=第六篇=1.查询数据库中重复的记录:select realname,count(*) from users group by realname having count(*)1=第七篇=SELECT TO.ItemCode, TO.ItemName FROM OITM TO WHERE exists (select 1 f rom OITM A where A.CODEBARS = TO.CODEBARS And A.ItemCode TO.Item

15、C ode)=第八篇=相信很多人在查询数据库时都会碰到检索某表中不重复记录的时候,提到检索不 重复记录,马上想到的肯定是Distinct或者Group By分组,小弟在初次使用的时候碰到了一些麻烦,这里拿出来与大家分享,希望对更多的 朋友有所帮助!先看看数据库表结构:表名:TEST 字段:Id,A,B,C,D其中B字段包含重复值;IdA BC D111 abvb222 afgfg333 dht sdf444 a345 de555 csfsf sscv666 brt fg卜面我们来看看用什么样的SQL语句检索出不含重复记录的数据:使用Distinct关键字Distinct关键字主要用来在SELE

16、CT查询记录中根据某指定字段的值去除重 复记录SELECT DISTINCT 字段名FROM 表名WHERE 检索条件字句所以用这样一句SQL就可以去掉重复项了 :color=SELECT DISTINCT (B) FROM TEST但是:这里有一个非常非常需要注意的地方:SELECT DISTINCT 字段名后面不能再跟其他的字段,否则检索出来的记录 仍然会含有重复项;错误写法:SELECT DISTINCT 字段名,其他字段名FROM 表名WHERE检索条件字句实际上,我们上面SQL语句结果集里就只有B字段;(一般情况下,这种结果应 该是很难满足需求的)如果我们的记录集里还需要有其他字段值

17、,那怎么办呢?实际上,我们完全可以用另一种办法来解决问题;只是需要用到子查询而已!使用GROUP BY分组有一点需要注意:使用带有GROUP BY字句的查询语句时,在SELECT列表指定的列要么是GROUP BY指定的列,要么包含聚合组函数所以用这样一句SQL就可以去掉重复项了 :color=SELECT * FROM TEST WHERE id in (SELECT MIN(id) FROM TEST GROUP BY B)这样就得到我们想要的结果集了 :IdA BC D111 a34 bvb333 dht sdf555 c sfsf sscv666 brt fg=第九篇=mysql=我的m

18、ysql表中的帐号是8位的随机数,我现在想查帐号有没有重复的,应该怎样 操作,select count(*) as num,帐号 from TABLE GROUP BY 帐号num 1就有重复!=第十篇=二二二(着急的人直接看红字)=在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供有d istinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回 不重复记录的条数,而不是用它来返回不重记录的所有值。其原因是distinct 只能返回它的目标字段,而无法返回其它字段,这个问题让我困扰了很久,用d istinct不能解决的话,我只有用二重循环查询来解决,而

19、这样对于一个数据量 非常大的站来说,无疑是会直接影响到效率的。所以我花了很多时间来研究这个 问题,网上也查不到解决方案,期间把容容拉来帮忙,结果是我们两人都郁闷 了。下面先来看看例子:tableid name TOC o 1-5 h z abccb库结构大概这样,这只是一个简单的例子,实际情况会复杂得多。比如我想用一条语句查询得到name不重复的所有数据,那就必须使用distinct 去掉多余的重复记录。select distinct name from table得到的结果是:nameabc好像达到效果了,可是,我想要得到的是id值呢?改一下查询语句吧: select distinct na

20、me, id from table结果会是:id name TOC o 1-5 h z abccb distinct怎么没起作用?作用是起了的,不过他同时作用了两个字段,也就是 必须得id与name都相同的才会被排除。我们再改改查询语句: select id, distinct name from table很遗憾,除了错误信息你什么也得不到,distinct必须放在开头。难到不能把d istinct放到where条件里?能,照样报错。很麻烦吧?确实,费尽心思都没能解决这个问题。没办法,继续找人问。拉住公司里一 JAVA程序员,他给我演示了 oracle里使用distinct之后,也没 找到m

21、ysql里的解决方案,最后下班之前他建议我试试group by。试了半天,也不行,最后在mysql手册里找到一个用法,用group_concat(dist inct name)配合group by name实现了我所需要的功能,兴奋,天佑我也,赶快 试试。报错。郁闷。连ysql手册也跟我过不去, 先给了我希望,然后又把我推向失望,好狠哪。再仔细一查,group_concat函数是4.1支持,晕,我4.0的。没办法,升级,升完级一试,成功。终于搞定了,不过这样一来,又必须要求客户也升级了。突然灵机一闪,既然可以使用group_concat函数,那其它函数能行吗?赶紧用count函数一试,成功,我

22、。想哭啊,费了这么多工夫。原来就这么简单。现在将完整语句放出: select *, count(distinct name) from table group by name 结果:id name count(distinct name) TOC o 1-5 h z a 1b 1c 1最后一项是多余的,不用管就行了,目的达到。唉,原来mysql这么笨,轻轻一下就把他骗过去了,郁闷也就我吧(对了,还有 容容那家伙),现在拿出来希望大家不要被这问题折腾。哦,对,再顺便说一句,group by必须放在order by和limit之前,不然会 报错,差不多了,发给容容放网站上去,我继续忙碌。更郁闷的事

23、情发生了,在准备提交时容容发现,有更简单的解决方法。select id, name from table group by nameselect * from table group by name=第十一篇=查询及删除重复记录的方法(一)1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断select * from peoplewhere peopleId in (select peopleId from people group by peopleId having count(peopleId) 1)2、删除表中多余的重复记录,重复记录是根据单个字段(people

24、Id)来判断,只留有rowid最小的记录delete from peoplewhere peopleId in (select peopleId from people group by peopleId havi ng count(peopleId) 1)and rowid not in (select min(rowid) from people group by peopleld hav ing count(peopleId )1)3、查找表中多余的重复记录(多个字段)select * from vitae awhere (a.peopleId,a.seq) in (select peo

25、pleId,seq from vitae group by peopleId,seq having count(*) 1)4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录delete from vitae awhere (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

26、、查找表中多余的重复记录(多个字段),不包含rowid最小的记录select * from vitae awhere (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,seqhaving count(*)1)(二)比方说在A表中存在一个字段“name”,而且不同记录之间的“name”值有可能会相同,现在就是需要查询出在该表中的各记

27、录之间,“name”值存在重复的项;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 integerdeclare cur_rows cursor local for select 主字段,count(*) from 表名 gr oup by 主字段 having count(*) ;1open cur_rowsfetch cur_rows into id,m

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论