| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 7298 人关注过本帖, 2 人收藏
标题:经典的删除重复记录问题总结。
只看楼主 加入收藏
厨师王德榜
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:199
帖 子:995
专家分:4966
注 册:2013-2-16
结帖率:100%
收藏(2)
 问题点数:0 回复次数:12 
经典的删除重复记录问题总结。
最近有学生在问删除表中重复记录问题,本人对此问题曾做过一些研究,现在做一个总结,算是抛砖引玉吧。
另外本文只讨论用SQL语句来解决问题,至于用VFP代码来做,以前已有前辈做了完整的示例,就不重复了。
*--------------------正文--------------------*
本文总结了四种常用的部分删除重复记录(不全删除,有条件的保留)场景:
有一个表 [jlzz1] ,原始记录如下:
图片附件: 游客没有浏览图片的权限,请 登录注册


情况介绍完毕。下面开始出题:
1、      以学籍号为判断依据,相同学籍号的重复记录,删除其最后一条
程序代码:
DELETE FROM jlzz1 ;
      WHERE jlzz1.id IN ( ;
    SELECT m2.mid ;
      FROM ( ;
               SELECT xjh, ;
                      xm, ;
                      max(id) AS mid ;
                 FROM jlzz1 ;
                WHERE jlzz1.xjh IN ( ;
                          SELECT cChongfu.xjh ;
                            FROM ( ;
                                     SELECT jlzz1.xjh, ;
                                            jlzz1.xm, ;
                                            count( * ) AS ts ;
                                       FROM jlzz1 ;
                                      GROUP BY xjh, ;
                                               xm ;
                                     HAVING ts > 1 ;
                                 ) AS cChongfu ;
                      )  GROUP BY xjh, ;
                         xm ;
           )  AS m2 )
运行后效果:

搜索更多相关主题的帖子: 经典的 删除 重复记录 FROM SELECT 
2017-12-28 11:35
厨师王德榜
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:199
帖 子:995
专家分:4966
注 册:2013-2-16
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册

2、      以学籍号为判断依据,相同学籍号的重复记录,删除首条
程序代码:
DELETE FROM jlzz1 ;
      WHERE jlzz1.id IN ( ;
    SELECT m2.mid ;
      FROM ( ;
               SELECT xjh, ;
                      xm, ;
                      min(id) AS mid ;
                 FROM jlzz1 ;
                WHERE jlzz1.xjh IN ( ;
                          SELECT cChongfu.xjh ;
                            FROM ( ;
                                     SELECT jlzz1.xjh, ;
                                            jlzz1.xm, ;
                                            count( * ) AS ts ;
                                       FROM jlzz1 ;
                                      GROUP BY xjh, ;
                                               xm ;
                                     HAVING ts > 1 ;
                                 ) AS cChongfu ;
                      )  GROUP BY xjh, ;
                         xm ;
           )  AS m2 )
运行后效果:
图片附件: 游客没有浏览图片的权限,请 登录注册

2017-12-28 11:38
厨师王德榜
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:199
帖 子:995
专家分:4966
注 册:2013-2-16
收藏
得分:0 
3、      以学籍号为判断依据,相同学籍号的重复记录,只保留最后一条
程序代码:
DELETE FROM jlzz1 ;
      WHERE jlzz1.id NOT IN ( ;
    SELECT m2.mid   FROM ( ;
               SELECT xjh,xm,max(id) AS mid ;
                 FROM jlzz1 ;
                GROUP BY xjh, xm ) AS m2)
运行后效果:
图片附件: 游客没有浏览图片的权限,请 登录注册

2017-12-28 11:40
厨师王德榜
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:199
帖 子:995
专家分:4966
注 册:2013-2-16
收藏
得分:0 
4、      以学籍号为判断依据,相同学籍号的重复记录,只保留首条
程序代码:
DELETE FROM jlzz1 ;
      WHERE jlzz1.id NOT IN ( ;
    SELECT m2.mid   FROM ( ;
               SELECT xjh,xm,min(id) AS mid ;
                 FROM jlzz1 ;
                GROUP BY xjh, xm ) AS m2)
运行后效果:
图片附件: 游客没有浏览图片的权限,请 登录注册

2017-12-28 11:42
厨师王德榜
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:199
帖 子:995
专家分:4966
注 册:2013-2-16
收藏
得分:0 
附:凡有重复记录的,一律删除(不保留):
程序代码:
DELETE FROM jlzz1 ;
      WHERE jlzz1.xjh  IN ( ;
    SELECT m2.xjh   FROM ( ;
               SELECT xjh,xm,count(*) AS ts ;
                 FROM jlzz1 ;
                GROUP BY xjh, xm having ts>1 ) AS m2)
运行后效果:
图片附件: 游客没有浏览图片的权限,请 登录注册

2017-12-28 11:43
厨师王德榜
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:199
帖 子:995
专家分:4966
注 册:2013-2-16
收藏
得分:0 
*--------------------正文结束--------------------*
欢迎提出批评和建议。
为了 练习方便,干脆把 表也传一个上来:
jlzz1.zip (764 Bytes)



[此贴子已经被作者于2017-12-28 11:49编辑过]

2017-12-28 11:46
schtg
Rank: 12Rank: 12Rank: 12
来 自:Usa
等 级:贵宾
威 望:67
帖 子:1790
专家分:3409
注 册:2012-2-29
收藏
得分:0 
@厨师王德榜,学习啦,谢谢!
2017-12-28 12:54
isealer
Rank: 3Rank: 3
等 级:论坛游侠
威 望:4
帖 子:33
专家分:110
注 册:2017-8-25
收藏
得分:0 
学习思路,多谢分享!
2017-12-28 14:27
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:0 
不错的示例,有益的总结。

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2017-12-28 19:16
我是11
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2018-1-1
收藏
得分:0 
SELECT xjh,xm,MAX(id) as mid FROM jlzz1 WHERE jlzz1.xjh in (SELECT a.xjh from( SELECT jlzz1.xjh,jlzz1.xm,COUNT(*) as ts FROM jlzz1 GROUP BY xjh,xm  HAVING ts>1) as a) GROUP BY xjh,xm
在尝试做第一种写法的时候,我曾漏掉后面的group by 字句,软件提示group by 字句缺少或无效。为什么一定要进行分组排列呢?是因为有MAX()函数?
此外,在jlzz1.xjh、jlzz1.xm 这两个字段名,我漏写jlzz1好像也可以达到效果?是不是有什么别的用途?
新手提问,大神们别见怪……
2018-01-02 21:58
快速回复:经典的删除重复记录问题总结。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022157 second(s), 11 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved