`
peachtao
  • 浏览: 38634 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
文章分类
社区版块
存档分类

查找数据库中重复数据

阅读更多
查找数据库中重复数据
========第一篇=========
在一张表中某个字段下面有重复记录,有很多方法,但是有一个方法,是比较高效的,如下语句:
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 (select data_guid from adam_entity_datas group by data_guid having count(*) > 1)
此方法查询出所有重复记录了,也就是说,只要是重复的就选出来,下面的语句也许更高效
select data_guid from adam_entity_datas where rowid in (select rid from (select rowid rid,row_number()over(partition by data_guid order by rowid) m from adam_entity_datas) where m <> 1)
目前只知道这三种比较有效的方法。

第一种方法比较好理解,但是最慢,第二种方法最快,但是选出来的记录是所有重复的记录,而不是一个重复记录的列表,第三种方法,我认为最好。

========第二篇=========
select usercode,count(*)       from ptype     group by usercode     having count(*) >1  
========第三篇=========
找出重复记录的ID:
select ID      from      
(         select ID ,count(*) as Cnt
from 要消除重复的表
group by ID
) T1
where T1.cnt>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  
   
方法二  
有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。  
   
1、对于第一种重复,比较容易解决,使用  
      select distinct * from tableName  
    就可以得到无重复记录的结果集。  
如果该表需要删除重复的记录,可以按以下方法删除  
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)  
   
最后一个select即得到了Name,Address不重复的结果集  
更改数据库中表的所属用户的两个方法  
大家可能会经常碰到一个数据库备份还原到另外一台机器结果导致所有的表都不能打开了,原因是建表的时候采用了当时的数据库用户……    
========第四篇=========
如何查询数据库中的重复记录?

比如说有个表中的数据是这样:
---------
a
a
a
b
b
c
---------

查询出的结果是:
记录   数量
a           3
b           2
c           1

怎样写这个SQL语句?
-----------------------
select distinct(name),count(*) from tabname group by name;
-------------------------------------
想出来了,这样就可以排序了。
select a1,count(a1)   as total from tablename group by a1 order by total desc
--------------------------------------
select distinct(a1),count(a1) as total from tablename group by a1 order by total desc
加个distinct更有效率
--------------------------------------------------------------
select p.*, m.* from table1 p left join table2 m on p.item1=m.item2 where p.item3=&#39;#$#@%$@&#39; order by p.item3 asc limit 10
就类似这么写
========第五篇=========
如何查找数据库中的重复记录? 能在Access中用的方法
----------------------------------------------------------------------
select *
from 表 A inner join (select 字段1,字段2 from 表 group by 字段1,字段2 having Count(*)>1) B on A.字段1=B.字段1 and A.字段2=B.字段2
--------------------------------------------------------
问题:
根据其中几个字段判断重复,只保留一条记录,但是要显示全部字段,怎么查询,谢谢!!
比如
字段1 字段2 字段3 字段4
a      b      c       1
a      b      c       1

a      b      d       2
a      b      d       3

b      b      d       2

想得到的结果为
a      b      c       1
a      b      d       2(或者3)
b      b      d       2
说明,根据字段1,2,3组合不重复,字段4 不考虑,得到了3个记录
但是也要显示字段4。
方法一:  
可以用临时表的方法来解决:
CurrentProject.Connection.Execute "drop table temptable"
CurrentProject.Connection.Execute "select * into temptable from 表2 where 1=2"
CurrentProject.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 = temptable.字段2) AND (表2.字段3 = temptable.字段3) SET temptable.字段4 = [表2].[字段4];"
方法二:
可以直接使用一个SELECT查询筛选出需要的数据:
可以假定第四字段都选值最小的
SELECT [1],[2], [3], Min([4]) AS Min4
FROM 表1
GROUP BY 表1.[1], 表1.[2], 表1.[3];

问题:
表2

id   NAME   r1    r2
1    1      w     ee
1    1      1     1232
1    2      123   123
1    2      12    434
1    2      123   123
2    1      123   123

ID 为数值,NAME 为字符。每条记录没有唯一标识。
要求取得 ID 和 NAME 合并后不重复的记录,如有重复保留其中一条即可,但要显示所有记录。
回答:
SELECT a.*, (select top 1 r1 from 表2 as a1 where a1.id=a.id and a1.name=a.name) AS r1, (select top 1 r2 from 表2 as a2 where a2.id=a.id and a2.name=a.name) AS r2
FROM [SELECT DISTINCT 表2.id, 表2.NAME
FROM 表2]. AS a;

SELECT a.*, dlookup("r1","表2","id=" & a.id   & " and name=&#39;"& a.name & "&#39;") AS r1, dlookup("r2","表2","id=" & a.id   & " and name=&#39;"& a.name & "&#39;") AS r2
FROM [SELECT DISTINCT 表2.id, 表2.NAME
FROM 表2]. AS a;

注意,上述代码中由于没有唯一标识列,因此显示的 R1 R2 的先后次序无从确定,一般是按输入的先后顺序,但是微软没有官方资料说明到底按哪个顺序,请网友注意。

请注意,上述表2为没有唯一标识字段,如果现在再建立一个自动编号字段“主键”则可以用以下代码

SELECT a.ID, a.name, b.r1, b.r2, b.主键
FROM (SELECT 表2.id, 表2.NAME, Min(表2.主键) AS 主键
FROM 表2
GROUP 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 T0.ItemCode, T0.ItemName FROM OITM T0 WHERE exists (select 1 from OITM A where A.CODEBARS = TO.CODEBARS And A.ItemCode < > TO.ItemCode)
========第八篇=========
相信很多人在查询数据库时都会碰到检索某表中不重复记录的时候,提到检索不重复记录,马上想到的肯定是Distinct或者Group By分组,
小弟在初次使用的时候碰到了一些麻烦,这里拿出来与大家分享,希望对更多的朋友有所帮助!

    先看看数据库表结构:
        表名: TEST 字段: Id,A,B,C,D
        其中B字段包含重复值;

Id
A B
C D
1
11 a
34 bvb
2
22 a
35 fgfg
3
33 d
ht sdf
4
44 a
345 de
5
55 c
sfsf sscv
6
66 b
rt fg

   
  









   

下面我们来看看用什么样的SQL语句检索出不含重复记录的数据:
使用Distinct关键字
    Distinct关键字主要用来在SELECT查询记录中根据某指定字段的值去除重复记录
    SELECT DISTINCT [字段名] FROM [表名] WHERE [检索条件字句]

    所以用这样一句SQL就可以去掉重复项了:
     

[color=]SELECT DISTINCT (B) FROM TEST

    但是:

    这里有一个非常非常需要注意的地方:
    SELECT DISTINCT [字段名]后面不能再跟其他的字段,否则检索出来的记录仍然会含有重复项;
      错误写法:
            SELECT DISTINCT [字段名] ,[其他字段名] FROM [表名] WHERE [检索条件字句]
   
    实际上,我们上面SQL语句结果集里就只有B字段;(一般情况下,这种结果应该是很难满足需求的)


    如果我们的记录集里还需要有其他字段值,那怎么办呢?

实际上,我们完全可以用另一种办法来解决问题;只是需要用到子查询而已!

使用GROUP BY 分组
    有一点需要注意:
       使用带有GROUP BY字句的查询语句时,在SELECT列表指定的列要么是GROUP BY 指定的列,要么包含聚合组函数

    所以用这样一句SQL就可以去掉重复项了:

[color=]SELECT * FROM TEST WHERE id in (SELECT MIN(id) FROM TEST GROUP BY B)

    这样就得到我们想要的结果集了:
    Id
A B
C D
1
11 a
34 bvb
3
33 d
ht sdf
5
55 c
sfsf sscv
6
66 b
rt fg

      

      






========第九篇======mysql===
----------------------------------------------------------------------

我的mysql表中的帐号是8位的随机数,我现在想查帐号有没有重复的,应该怎样操作,


----------------------------------------------------------------------

select count(*) as num,帐号 from TABLE GROUP BY 帐号
num > 1 就有重复!

========第十篇====(着急的人直接看红字)=====
在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所有值。其原因是distinct只能返回它的目标字段,而无法返回其它字段,这个问题让我困扰了很久,用distinct不能解决的话,我只有用二重循环查询来解决,而这样对于一个数据量非常大的站来说,无疑是会直接影响到效率的。所以我花了很多时间来研究这个问题,网上也查不到解决方案,期间把容容拉来帮忙,结果是我们两人都郁闷了。。。。。。。。。

下面先来看看例子:

     table
   id name
   1 a
   2 b
   3 c
   4 c
   5 b

库结构大概这样,这只是一个简单的例子,实际情况会复杂得多。

比如我想用一条语句查询得到name不重复的所有数据,那就必须使用distinct去掉多余的重复记录。

select distinct name from table
得到的结果是:

   name
   a
   b
   c

好像达到效果了,可是,我想要得到的是id值呢?改一下查询语句吧:

select distinct name, id from table

结果会是:

   id name
   1 a
   2 b
   3 c
   4 c
   5 b

distinct怎么没起作用?作用是起了的,不过他同时作用了两个字段,也就是必须得id与name都相同的才会被排除。。。。。。。

我们再改改查询语句:

select id, distinct name from table

很遗憾,除了错误信息你什么也得不到,distinct必须放在开头。难到不能把distinct放到where条件里?能,照样报错。。。。。。。

很麻烦吧?确实,费尽心思都没能解决这个问题。没办法,继续找人问。

拉住公司里一JAVA程序员,他给我演示了oracle里使用distinct之后,也没找到mysql里的解决方案,最后下班之前他建议我试试group by。

试了半天,也不行,最后在mysql手册里找到一个用法,用group_concat(distinct name)配合group by name实现了我所需要的功能,兴奋,天佑我也,赶快试试。

报错。。。。。。。。。。。。郁闷。。。。。。。连mysql手册也跟我过不去,先给了我希望,然后又把我推向失望,好狠哪。。。。

再仔细一查,group_concat函数是4.1支持,晕,我4.0的。没办法,升级,升完级一试,成功。。。。。。

终于搞定了,不过这样一来,又必须要求客户也升级了。

突然灵机一闪,既然可以使用group_concat函数,那其它函数能行吗?

赶紧用count函数一试,成功,我。。。。。。。想哭啊,费了这么多工夫。。。。。。。。原来就这么简单。。。。。。

现在将完整语句放出:

select *, count(distinct name) from table group by name

结果:

   id name count(distinct name)
   1 a 1
   2 b 1
   3 c 1

最后一项是多余的,不用管就行了,目的达到。。。。。

唉,原来mysql这么笨,轻轻一下就把他骗过去了,郁闷也就我吧(对了,还有容容那家伙),现在拿出来希望大家不要被这问题折腾。

哦,对,再顺便说一句,group by 必须放在 order by 和 limit之前,不然会报错,差不多了,发给容容放网站上去,我继续忙碌。。。。。。

-----------------------------------------------------------------------------------------


更郁闷的事情发生了,在准备提交时容容发现,有更简单的解决方法。。。。。。

select id, name from table group by name
select * from table group by name


========第十一篇=========

查询及删除重复记录的方法
(一)
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)

(二)
比方说
在A表中存在一个字段“name”,
而且不同记录之间的“name”值有可能会相同,
现在就是需要查询出在该表中的各记录之间,“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 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

  方法二

  有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如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)

  最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)

(四)
查询重复

select * from tablename where id in (

select id from tablename

group by id

having count(id) > 1

)
分享到:
评论

相关推荐

    删除Access数据库中重复的数据

    3. **查找重复数据**:在Access中,可以使用查询来找出重复数据。创建一个“选择查询”,在查询设计视图中,选择那些可能包含重复数据的字段,并添加计算字段来检测重复。例如,你可以创建一个计算字段,公式为`...

    怎样删除数据库中重复记录

    删除数据库中重复记录是数据库管理中一个常见的问题,特别是在数据量庞大的时候。今天,我们将讨论删除数据库中重复记录的经典方法,包括使用 SQL 语句和其他技巧。 查找表中多余的重复记录 要删除数据库中重复...

    数据库 查询删除重复数据

    数据库查询删除重复数据是数据库管理中的一项重要操作,旨在查找和删除表中的重复记录。重复记录是根据单个字段或多个字段来判断的。下面介绍几种查找和删除重复记录的方法。 根据单个字段查找和删除重复记录 可以...

    Delphi找出数据库重复数据..rar

    本资源"Delphi找出数据库重复数据"提供了一个解决方案,帮助开发者高效地定位并处理这些重复信息。 首先,我们需要理解什么是数据库中的重复数据。重复数据通常指的是在特定字段或一组字段中存在完全相同的记录,这...

    易语言数据库检查重复字段模块

    "易语言数据库检查重复字段模块"提供了一种高效的方法,用于检测和处理数据库中的重复数据,以保证数据的完整性和一致性。本文将深入解析这个模块的功能、原理以及在实际应用中的操作步骤。 易语言,作为一种简洁...

    删除数据库中的重复记录

    在Access这样的关系数据库管理系统中,利用SQL查询和内置功能可以有效地管理和清理重复数据。在实际操作中,始终建议先备份数据,以免发生意外。同时,优化数据模型和实施数据验证策略是防止重复数据的根本途径。

    删除表中重复数据sql语句

    在数据库管理中,重复数据是一个常见的问题,尤其当数据库经历长时间的数据输入时,可能会出现数据录入错误或者批量导入过程中导致的数据冗余。重复数据的存在不仅浪费存储空间,还可能导致数据统计失真以及查询结果...

    删除Access数据库中重复的记录

    一个自动删除Access数据库中重复的记录的源代码。在Access中一般只能查找10行大概20条重复记录,这样程序就可以任意指定表及多字段检索重复记录,并把重复的记录移除到一个临时表中,并不是进行真正删除,你可以进行...

    灰太狼_重复数据查找

    在实际使用中,"灰太狼_重复数据查找"工具可能适用于各种场景,比如清理邮件列表中的重复地址、查找数据库中的重复记录、分析文本文件中的重复词汇等。它简化了原本可能需要编程技能才能完成的任务,降低了非专业...

    DataReader读取数据并查数据库数据是否重复

    在读取过程中,我们可以将每条读取到的数据与数据库中的现有数据进行比较,以查找重复项。 ```csharp connection.Open(); SqlDataReader reader = command.ExecuteReader(); while (reader.Read()) { int ...

    往数据库插入数据,相同的不插入

    但在实际操作过程中,为了避免重复数据的插入,我们需要实现一种机制来判断待插入的数据是否已存在于数据库中。这不仅可以提高数据的准确性,还能有效避免因数据冗余而引发的一系列问题。 #### 核心需求解读 根据...

    PHP实现在数据库百万条数据中随机获取20条记录的方法

    本文实例讲述了PHP实现在数据库百万条数据中随机获取20条记录的方法。分享给大家供大家参考,具体如下: 额,为什么要写这个? 在去某个公司面试时,让写个算法出来,当时就蒙了,我开发过程中用到算法的吗?又不是...

    MySQL根据某一个或者多个字段查找重复数据的sql语句

    sql 查出一张表中重复...2、查询出所有数据进行分组之后,和重复数据的重复次数的查询数据,先列下: select count(username) as '重复次数',username from xi group by username having count(*)&gt;1 order by userna

    C# 用SQL自动记录数据并且查询出某一列有哪些重复数据

    本主题聚焦于如何在C#中利用SQL来自动记录数据,并查询出某一列中的重复数据。以下将详细讲解这一过程,以及相关知识点。 首先,我们需要理解C#和SQL的基础。C#是一种面向对象的编程语言,广泛应用于开发Windows...

    查找重复数据的复杂示例

    在数据分析和数据库管理中,查找重复数据是一项至关重要的任务,特别是在大数据环境中,重复数据可能导致错误的分析结果和不必要的存储浪费。本示例“查找重复数据的复杂示例2(07)”将深入探讨如何在复杂的数据集里...

    去除重复数据,去除重复数据算法

    - 对于当前元素,在已处理的数据中查找是否存在相同的元素。 - 如果不存在,则将当前元素添加到结果集合中。 4. **返回结果**:完成遍历后,结果集合即为不含重复项的数据集。 ### C++ 实现细节 以下是对给定...

    从mysql数据库中挑选重复用户

    在处理大量数据时,经常会遇到需要找出数据库中重复记录的情况。这对于数据清洗、数据分析以及确保数据质量都非常重要。本文将详细介绍如何使用SQL语句来查找MySQL数据库中的重复用户。 #### 核心SQL查询语句解析 ...

    数据库表查找工具

    5. **性能优化**:为了提高查找效率,工具可能采用了缓存策略,预先计算并存储部分常用查询的结果,避免重复扫描数据库。 6. **错误处理**:对于无效的输入或数据库访问错误,工具应提供适当的错误提示和处理机制。...

    ACCEES数据库 建立运用查找

    ### ACCEES数据库:建立与运用查找 #### 一、ACCEES数据库简介与应用场景 Access作为一款由Microsoft开发的桌面关系型数据库管理系统,在企业和个人用户中被广泛使用。它不仅可以帮助用户创建复杂的数据库结构,还...

    易语言数据库检查重复字段模块源码.rar

    这个模块源码提供了这样的功能,通过分析和比较数据库中的字段,找出重复的数据,并提供相应的处理策略。 源码中可能包含了以下关键知识点: 1. 数据库接口:易语言支持多种数据库接口,如ODBC、ADO等,用于连接和...

Global site tag (gtag.js) - Google Analytics