`

SQL查询重复数据和清除重复数据

阅读更多

 

ps:今天去面试被这个问题考倒了,sql要恶补一下了。
选择重复,消除重复和选择出序列

有例表:emp
emp_no   name    age    
    001           Tom      17    
    002           Sun      14    
    003           Tom      15    
    004           Tom      16

 

要求:
列出所有名字重复的人的记录
(1)最直观的思路:要知道所有名字有重复人资料,首先必须知道哪个名字重复了:
select  name  from  emp  group  by  name  having  count(*)>1

 

所有名字重复人的记录是:
select  *  from  emp
    where name  in  (select  name  from   emp group   by   name having count(*)>1)

 

(2)稍微再聪明一点,就会想到,如果对每个名字都和原表进行比较,大于2个人名字与这条记录相同的就是合格的 ,就有
select   *   from   emp   where   (select   count(*)   from   emp   e    where   e.name=emp.name)   >1
--注意一下这个>1,想下如果是 =1,如果是 =2 如果是>2 如果 e 是另外一张表 而且是=0那结果 就更好玩了:)
这个过程是 在判断工号为001的 人 的时候先取得 001的 名字(emp.name) 然后和原表的名字进行比较 e.name
注意e是emp的一个别名。

 

再稍微想得多一点,就会想到,如果有另外一个名字相同的人工号不与她他相同那么这条记录符合要求:
select   *   from   emp    
    where   exists    
                  (select   *   from   emp   e    where   e.name=emp.name   and   e.emp_no<>emp.emp_no)

 

此思路的join写法:
select   emp.*       from   emp,emp e
        where emp.name=e.name and emp.emp_no<>e.emp_no

 

 

/*     这个语句较规范的   join   写法是    
select emp.* from   emp   inner join emp   e     on emp.name=e.name and emp.emp_no<>e.emp_no    
但个人比较倾向于前一种写法,关键是更清晰     */    
b、有例表:emp    
name     age    
Tom       16    
Sun        14    
Tom       16    
Tom       16

 


----------------------------------------------------清除重复----------------------------------------------------
过滤掉所有多余的重复记录
(1)我们知道distinct、group by 可以过滤重复,于是就有最直观的 
 


select   distinct   *   from   emp     或     select   name,age   from   emp   group   by   name,age
获得需要的数据,如果可以使用临时表就有解法:
 


select   distinct   *   into   #tmp    from   emp  
    delete   from   emp  
    insert   into   emp   select   *   from   #tmp

 

 


(2)但是如果不可以使用临时表,那该怎么办?
我们观察到我们没办法区分数据(物理位置不一样,对 SQL Server来说没有任何区别),思路自然是想办法把数据区分出来了,既然现在的所有的列都没办法区分数据,唯一的办法就是再加个列让它区分出来,加什么列好?最佳选择是identity列: 
 


alter   table   emp   add   chk   int   identity(1,1)
 表示例:


 
name   age   chk    
    Tom     16     1    
    Sun      14     2    
    Tom     16     3    
    Tom     16     4
重复记录可以表示为:
 


select   *   from   emp where (select   count(*)   from   emp   e   where   e.name=emp.name)>1
 要删除的是:
 


delete   from   emp
    where (select   count(*)   from   emp   e     where   e.name=emp.name   and   e.chk>=emp.chk)>1
 


再把添加的列删掉,出现结果。
 


alter   table   emp   drop   column   chk
 


(3)另一个思路:
视图
select   min(chk) from   emp group   by   name having   count(*)   >1
 获得有重复的记录chk最小的值,于是可以
 
delete from   emp where chk   not   in (select min(chk) from   emp group   by   name)
写成join的形式也可以:
 
(1)有例表:emp
 
emp_no    name    age     
 001            Tom      17     
 002            Sun       14     
 003            Tom      15     
 004            Tom      16
 ◆要求生成序列号
(1)最简单的方法,根据b问题的解法:
 
alter   table   emp   add   chk   int   identity(1,1)   或  
    select   *,identity(int,1,1)   chk   into   #tmp   from   emp
 ◆如果需要控制顺序怎么办?
 
select   top   100000   *,identity(int,1,1)   chk   into   #tmp   from   emp   order   by   age
 (2) 假如不可以更改表结构,怎么办?
如果不可以唯一区分每条记录是没有办法的,在可以唯一区分每条记录的时候,可以使用a 中的count的思路解决这个问题
 
select   emp.*,(select   count(*)   from   emp   e   where   e.emp_no<=emp.emp_no)  
    from   emp  
    order   by   (select   count(*)   from   emp   e   where   e.emp_no<=emp.emp_no)

 

 

 

分享到:
评论

相关推荐

    经常面试到的SQL题(查询重复数据和清除重复数据)

    在SQL中,查询和清除重复数据是数据库管理中常见的任务,尤其在面试中,这个问题经常被用来测试候选人的技能和经验。以下是对这个主题的详细解释。 首先,我们需要理解什么是重复数据。在数据库中,重复数据指的是...

    经常面试到的SQL题(查询重复数据和清除重复数据).

    在SQL领域,查询和清除重复数据是常见的数据库管理任务,对于面试者来说,掌握这部分知识至关重要。本主题将深入探讨如何使用SQL来检测并处理重复数据。 首先,我们需要理解什么是重复数据。在数据库中,重复数据指...

    轻松消除SQL SERVER重复记录

    最后,清空原表`Products`,并将`Products_temp`表中的数据导入,以替换原有的重复数据。完成后,删除临时表`Products_temp`。 ```sql DELETE Products INSERT INTO Products SELECT * FROM Products_temp DROP ...

    查询和删除表中重复数据sql语句

    标题和描述概述的知识点主要集中在SQL语言中处理表内重复数据的方法上,涵盖了查询与删除重复数据的不同场景。下面将详细解析这些知识点: ### 查询表中重复数据 #### 单字段重复数据查询 ```sql SELECT * FROM ...

    SQL数据的查询和更新实验报告报告.pdf

    【SQL数据查询与更新实验报告】的实验主要涵盖了SQL语言中的关键操作,旨在让学生熟练掌握对数据库进行数据查询和更新的方法。以下是对实验内容的详细解释: ### 1. SQL数据查询 #### 1.1 单表查询 - **查询所有列...

    SQL删除表里的重复数据的两种方法

    ### SQL删除表里重复数据的两种方法 在数据库管理中,数据的一致性和准确性是非常重要的。重复的数据不仅会占用额外的存储空间,还可能导致查询结果的不准确。因此,掌握如何有效地删除表中的重复记录是每个数据库...

    数据库管理中基于SQL的重复数据查询与清理方法详解

    文中提供了针对单一字段以及多个字段的重复数据查询方法,并且展示了具体的数据清洗操作步骤,包括删除多余记录并保留所需数据的技巧。文档不仅列举了有效的SQL脚本示例,还讨论了一些常见的错误及其修正方式。 适合...

    SQL的数据查询功能之二---简单查询

    当查询的结果可能包含重复的行时,可以使用`DISTINCT`关键字来消除重复,确保结果集中的每条记录都是唯一的。例如,在查询选修过课程的学生学号时: ```sql SELECT DISTINCT Sno FROM SC; ``` 这条语句将返回所有...

    SQL数据的查询和更新实验报告报告.docx

    该实验报告主要介绍了 SQL 数据查询和更新的实验步骤,旨在熟悉 SQL 语句的数据查询语言,并能够对数据库进行单表查询、连接查询、嵌套查询、集合查询和统计查询。 一、单表查询 * 查询的目标表达式可以是所有列、...

    一条SQL清除(单字段、多字段)重复数据的办法.txt

    在数据库管理中,清理重复数据是一项常见的任务,尤其是在数据整合或迁移过程中,或是为了保持数据的完整性和准确性。本文将详细解析如何通过SQL语句来有效地清除单字段或多字段的重复数据,确保数据库中的每条记录...

    SQL 重复函数 2005

    基于此理解,我们将围绕SQL中处理重复数据的关键技术进行探讨,包括`DISTINCT`关键字、自定义查询以及可能涉及的相关操作。 ### SQL中的`DISTINCT`关键字 #### 1. `DISTINCT`关键字简介 在SQL中,`DISTINCT`关键字...

    Oracle删除表中的重复数据

    这种方式不仅清除了重复数据,而且保证了原表的数据结构和名称不变,对数据库的其他部分没有影响。 ### 总结 在Oracle中删除表中的重复数据是一个涉及到数据安全性和效率的关键操作。通过上述步骤,可以有效地清除...

    清除SQL数据库里的重复记录

    总结来说,清除SQL数据库中的重复记录是数据治理的关键部分,可以通过检测和删除步骤实现。同时,通过合理的设计和约束,可以预防重复记录的产生。在进行这些操作时,务必确保数据的安全,并定期检查和维护数据库的...

    利用 EMC Avamar 全局重复数据消除软件实现高效数据保护

    - **定义与原理**:全局重复数据消除是一种在多个数据源之间识别和删除重复数据副本的过程。EMC Avamar通过将数据分割成较小的数据段,并在这些段之间查找重复项来实现这一点。 - **技术优势**:这种方法极大地减少...

    sqlserver清除完全重复的数据只保留重复数据中的第一条

    在SQL Server中,有时我们需要处理重复数据,确保数据库中只保留每组重复数据的一个实例,通常是最早或最新的记录。在给定的标题和描述中,我们看到一个具体的方法来实现这个目标,即通过创建临时表并利用`identity`...

    sql语句重复操作

    在SQL语句中,处理重复数据是一项常见的任务。在给定的标题和描述中,主要涉及如何找出并处理数据库表中的重复记录。这里我们将详细探讨几种不同的方法。 首先,要找出重复的记录,我们可以利用`GROUP BY`和`HAVING...

    SQL查询语句大全

    本文将深入讲解SQL查询的各种类型和技巧,包括基本查询、别名使用、消除重复行、比较运算符、取值范围以及模糊查询。 首先,SQL查询分为多种类型。例如,可以创建不涉及任何表的查询,如示例中的"age: 2008 years, ...

    利用Infopath2007实现SQL2005的数据查询

    本文将探讨如何利用Infopath2007和JavaScript扩展其功能,以实现对SQL Server 2005数据库的范围数据查询。 首先,我们需要创建一个基于SQL Server的Infopath表单模板。打开Infopath2007,选择“设计表单模板” → ...

    SQL去重 清除冗余数据

    SQL去重是指清除查询结果或者是数据库里不必要的相对某个字段的冗余数据。对于查询结果去重,可以使用distinct关键字标注需要去重的字段,也可以使用group by + 关键字。 使用distinct关键字可以取得不重复的值,...

    基于重复数据删除技术的SQL Server数据库备份系统.pdf

    基于重复数据删除技术的SQL Server数据库备份系统是一种优化备份效率和存储空间的有效方法。本文将深入探讨这种技术的工作原理、优势以及如何在实际操作中实施。 首先,理解重复数据删除(Data Deduplication)的...

Global site tag (gtag.js) - Google Analytics