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

标题: SQL查询重复数据和清除重复数据(二) [打印本页]

作者: 万望    时间: 2020-4-19 23:45
标题: SQL查询重复数据和清除重复数据(二)
本帖最后由 万望 于 2016-5-19 23:48 编辑


过滤掉所有多余的重复记录
(
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)



作者: 万望    时间: 2020-4-19 23:56

作者: 万望    时间: 2020-4-22 23:37





欢迎光临 度量快速开发平台-专业、快速的软件定制快开平台 (http://bbs.delit.cn/) Powered by Discuz! X3.2