度量快速开发平台-专业、快速的软件定制快开平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 部件 流程 SQL
查看: 1222|回复: 2
打印 上一主题 下一主题

[分享] SQL查询重复数据和清除重复数据(一)

[复制链接]

348

主题

3572

帖子

9378

积分

论坛元老

Rank: 8Rank: 8

积分
9378
跳转到指定楼层
楼主
发表于 2020-4-18 23:05:56 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 万望 于 2016-5-18 23:07 编辑

选择重复,消除重复和选择出序列


要求:

列出所有名字重复的人的记录

(
1)最直观的思路:要知道所有名字有重复人资料,首先必须知道哪个名字重复了:

  1. select   name   from   emp       group   by   name     having   count(*)>1
复制代码

所有名字重复人的记录是:


  1. select   *   from   emp  where name   in   (select   name   from   emp group   by   name having count(*)>1)
复制代码

(2
  1. select   *   from   emp   where   (select   count(*)   from   emp   e    where   e.name=emp.name)   >1
复制代码

)稍微再聪明一点,就会想到,如果对每个名字都和原表进行比较,大于2个人名字与这条记录相同的就是合格的 ,就有

--注意一下这个>1,想下如果是 =1,如果是 =2 如果是>2 如果 e 是另外一张表 而且是=0那结果 就更好玩了
  1. select   *   from   emp     
  2.     where   exists     
  3.                   (select   *   from   emp   e    where   e.name=emp.name   and   e.emp_no<>emp.emp_no)
复制代码

这个过程是 在判断工号为001的 人 的时候先取得 001的 名字(emp.name) 然后和原表的名字进行比较 e.name

注意e是emp的一个别名。

再稍微想得多一点,就会想到,如果有另外一个名字相同的人工号不与她他相同那么这条记录符合要求:


此思路的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     
但个人比较倾向于前一种写法,关键是更清晰     */     

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
若現在就覺得失望無力,未來那麽遠妳該怎麽扛...
————————————————————————致自己
回复

使用道具 举报

348

主题

3572

帖子

9378

积分

论坛元老

Rank: 8Rank: 8

积分
9378
沙发
 楼主| 发表于 2020-4-18 23:08:18 | 只看该作者
若現在就覺得失望無力,未來那麽遠妳該怎麽扛...
————————————————————————致自己
回复 支持 反对

使用道具 举报

328

主题

3738

帖子

8566

积分

作者

Rank: 7Rank: 7Rank: 7

积分
8566
QQ
板凳
发表于 2020-4-19 15:28:22 | 只看该作者
这个还是比较实用的!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|重庆度量科技  本站关键词:快速开发平台

GMT+8, 2024-12-23 14:27 , Processed in 0.136172 second(s), 29 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表