`

【转载】数据库中重复数据的查询

 
阅读更多
原文地址:http://zhouhua.blog.51cto.com/601404/167634,希望大家到源地址去看,支持作者。本文只是本人留下来作为记录。[size=xx-large][/size]

========第一篇=========
在一张表中某个字段下面有重复记录,有很多方法,但是有一个方法,是比较高效的,如下语句:
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

)
分享到:
评论

相关推荐

    数据库图标

    在描述中提到的"数据库图标(转载)"可能是指一个资源集合,包含各种与数据库相关的图形设计,可能是为了UI设计、报告制作或教学材料。由于文件名是"DBIcons",我们可以推断这个RAR压缩包可能包含一系列的数据库图标...

    jdbc连接数据库的方式2

    如果利用Oracle的面向对象的技术,可以通过创建一个新的数据库对象类型在数据库中模仿其数据和操作,然后使用JPublisher等工具生成自己的Java bean类。如果使用这种方式,不但Java应用程序可以使用应用软件的对象...

    【RPA之家转载视频教程2】UiPath Studio中的数据抓取——使用UiPath将结果从网站复制到记事本.rar

    【RPA之家】提供的【RPA之家转载视频教程2】主要介绍了UiPath Studio中的数据抓取技术,通过这个教程,我们可以深入理解如何利用RPA工具高效地自动化处理网络上的信息。RPA,即机器人流程自动化,是一种先进的技术,...

    Hibernate缓存机制,转载

    一级缓存是内存中的临时存储区域,当查询数据库时,Hibernate首先检查一级缓存中是否存在所需对象,如果存在则直接返回,无需再次查询数据库。当修改对象并调用Session的flush()方法时,Hibernate会将一级缓存中的脏...

    摘录转载sql语句大全

    1. **选择最有效的表名顺序**:在ORACLE数据库中,FROM子句中的表处理顺序是从右到左,因此,应将记录最少的表放在最后,以减少数据处理量。在多表连接查询中,选择交叉表作为基础表,以优化查询效率。 2. **WHERE...

    用STRUTS的TOKEN机制解决表单重复提交,转载自:百度文库

    在处理表单提交时,如果用户意外地多次点击了提交按钮,可能会导致数据的重复录入,从而引起不必要的问题,例如订单重复、数据库数据异常等。为了解决这个问题,开发者可以利用Struts框架提供的Token机制。 首先,...

    本人提供SQL语句大全(转载) 12009年04月28日 星期二 19:35SQL语句大全(转载)

    从给定的文件信息中,我们可以提炼出一系列与SQL语句相关的知识点,这些知识点涵盖了SQL的基本操作、查询优化以及在不同数据库系统中的表现差异。以下是对这些知识点的详细阐述: ### 1. SQL语句大全 文件标题和...

    【转载】浅谈基于索引的SQL语句优化方法

    索引是数据库管理系统中的一个重要概念,它能显著加速数据检索过程,尤其是在处理大量数据时。 一、索引的基本原理 索引类似于书籍的目录,通过建立索引,数据库系统可以快速定位到数据存储的位置。非聚簇索引存储...

    ruby on rails, 非常棒的启蒙教材(转载)

    在Rails中,模型代表数据库中的数据,视图负责展示,而控制器则处理用户的请求并协调模型和视图之间的交互。 Rails的核心特性包括ActiveRecord,这是一个对象关系映射(ORM)系统,它允许开发者用Ruby代码操作...

    Oracle 语法之 OVER (PARTITION BY ..) 及开窗函数(转载)

    `OVER (PARTITION BY ...)` 和开窗函数在Oracle数据库中提供了极其强大的数据处理能力,特别是在需要进行复杂的数据分析或报表制作时。掌握这些技术对于提高数据库查询效率和数据处理能力至关重要。

    SqlHelper.cs

    SqlHelper是一个基于.NETFrameWork的数据库操作组件,组件中包含操作数据库的各种方法,他封装的目的无疑是简化重复写的数据库连接,当SqlHelper封装以后,只需要给方法传入一些参数,就可以实现对数据库的访问。...

    不需要应用服务器的J2EE【转载】

    6. **源代码分析**:Bank类的源代码展示了如何使用JDBC与数据库进行交互,包括连接获取、查询和关闭等基本操作。MessageDrivenBank类则可能包含监听JMS队列的代码,并调用Bank类的方法来处理接收到的订单。 综上所...

    【RPA之家转载AA视频教程】37.Recordea.rar

    5. **读写操作**:学习如何在自动化过程中实现数据的读取和写入,例如从Excel表格导入数据或向数据库写入信息。 6. **调试和优化**:理解如何测试自动化任务,找出并修复潜在问题,以提高自动化流程的准确性和效率。...

    【RPA之家转载AA视频教程】11.Bot的开发和调试界面介绍.rar

    这可能包括从数据库、文件或网页中提取数据,或对数据进行计算、转换等操作。 4. **异常处理**:考虑到实际运行环境的复杂性,开发者需要设定异常处理机制,使Bot在遇到错误时能有适当的响应,如重试、跳过、报告...

    【RPA之家转载视频教程3】将安全字符串转换为字符串--UIPath.rar

    在本教程"【RPA之家转载视频教程3】将安全字符串转换为字符串--UIPath"中,我们将深入探讨如何利用UIPath这一RPA工具进行特定的数据处理工作。 UIPath是目前市场上广泛应用的一款RPA平台,它提供了丰富的活动库,...

    【RPA之家转载AA视频教程】26.How.rar

    本篇将主要围绕"【RPA之家转载AA视频教程】26.How.rar"中的核心主题——如何在Enterprise A2019中使用Step Actions进行深入探讨。 Step Actions是RPA工具Enterprise A2019中的关键组件,它们构成了自动化流程的基础...

Global site tag (gtag.js) - Google Analytics