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);

转自http://www.cnblogs.com/yellowapplemylove/archive/2011/04/19/2021519.html

SQL查询表中重复数据相关推荐

  1. MySQL 查询表中重复数据

    查询重复手机号 SELECTuser_mobile FROM`t_user` GROUP BYuser_mobile HAVINGCOUNT( user_mobile ) > 1; 查询重复的手 ...

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

    查询和删除表中重复数据sql语句 (一) 1.查询表中重复数据.select * from people where peopleId in (select   peopleId  from   pe ...

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

    ========第一篇========= 在一张表中某个字段下面有重复记录,有很多方法,但是有一个方法,是比较高效的,如下语句: select data_guid from adam_entity_d ...

  4. 查找数据库中重复数据T-SQL

    查找数据库中重复数据T-SQL ========第一篇========= 在一张表中某个字段下面有重复记录,有很多方法,但是有一个方法,是比较高效的,如下语句: select data_guid fr ...

  5. MySql删除表中重复数据

    有一表中存在大量重复数据 在此记录下我删除表内重复数据的方法 -- 新增测试表 create table basic_farmer ( id INT(11), user_name VARCHAR(25 ...

  6. (笔记)Mysql命令select from:查询表中的数据(记录)

    select from命令用来查询表中的数据. 1) 查询所有行 命令格式: select <字段1, 字段2, ...> from < 表名 > where < 表达式 ...

  7. java list 重复数据_java 查找list中重复数据实例详解

    java 查找list中重复数据实例详解 需求: 查找一个List集合中所有重复的数据,重复的数据可能不止一堆,比如:aa, bb, aa, bb, cc , dd, aa这样的数据.如果有重复数据, ...

  8. SQL Server中的数据层应用程序简介

    In this article, I'm going to introduce the data-tier applications in SQL Server. As the official do ...

  9. 在AWS RDS SQL Server中恢复数据

    This article explores the process to recover data in AWS RDS SQL Server and its recent enhancements. ...

最新文章

  1. 生活很急躁,史前也一样
  2. Android8.0适配方案
  3. 让fedora18桌面显示图标
  4. linux内核分析与移植,内核分析移植
  5. java api math_JAVA 函数 Math API
  6. jsp不能使用return时候,如何在出异常时退出,不在向下执行
  7. 【廖雪峰官方网站/Java教程】注解
  8. vue多html标签,Vue实现多标签选择器
  9. yarn开启Label Scheduler
  10. 骗分技巧————《OI骗分导论》
  11. 百度地图,定位,添加图标
  12. IOS开发:如何修改 SwiftUI 模板项目的启动页面
  13. 高二学业水平测试计算机考试时间,2019高中学业水平考试时间 普通高中学业水平什么时候考试...
  14. 2019千股跌停情况是什么?千股跌停原因都有哪些?
  15. android 启动高德导航规划
  16. 昇思MindSpore携手宝兰德推出智慧工地解决方案,助力工地安全生产管理领域数智化升级
  17. matlab 模拟交易,股票量化投资策略模拟交易系统 [2017.03.26 更新]
  18. python arp扫描_Python3利用scapy局域网实现自动多线程arp扫描功能
  19. String为什么无法在方法中修改原有string变量的值
  20. python 能源系统建模:message-ix Integrated assessment model的安装

热门文章

  1. ACM-ICPC 2018 焦作赛区网络预赛A. Magic Mirror(签到题)
  2. SAP FICO 解析成本要素类别
  3. MATLAB trapz梯形数值积分函数
  4. 用户画像 用户画像表
  5. C++读写txt文档
  6. Upload labs
  7. bandit(21-25)
  8. Junit、Json和kv结构的相互转化
  9. 使用XMAPP启动MySQL出现Error: MySQL shutdown unexpectedly 的解决办法
  10. 金蝶 EAS WebService 发布过程