设为首页 收藏本站
查看: 768|回复: 0

[经验分享] oracle删除重复的行

[复制链接]

尚未签到

发表于 2016-7-21 09:49:04 | 显示全部楼层 |阅读模式
  需求:当多行tid重复时,保留tid小的的行,其他重复的行删除。

原书数据:
select t.*,t.rowid from test12 t;
TID        TNAME        TTIME        SSEX        ROWID
11        12                                      AAAMP+AAEAAAAC0AAA
111        1a2                                     AAAMP+AAEAAAAC0AAB
21        2121                    2012-11-13 15:30:45                AAAMP+AAEAAAAC0AAC
21        2121                    2012-11-13 15:41:18        男        AAAMP+AAEAAAAC0AAD
23        2121                    2012-11-13 15:41:31        女        AAAMP+AAEAAAAC0AAE
23        2121                    2012-11-13 15:41:48        nv        AAAMP+AAEAAAAC0AAF

实现:通过rowid
select s.tid,min(s.rowid) from test12 s,test12 t where t.tid=s.tid group by s.tid;

11        AAAMP+AAEAAAAC0AAA
21        AAAMP+AAEAAAAC0AAC
23        AAAMP+AAEAAAAC0AAE
111        AAAMP+AAEAAAAC0AAB

select s.tid,s.rowid from test12 s,test12 t where s.rowid>t.rowid and t.tid=s.tid;
21        AAAMP+AAEAAAAC0AAD
23        AAAMP+AAEAAAAC0AAF

select s.tid,s.rowid from test12 s,test12 t where s.rowid<t.rowid and t.tid=s.tid;
21        AAAMP+AAEAAAAC0AAC
23        AAAMP+AAEAAAAC0AAE

删除方法一:成功!
delete test12 t where t.rowid not in (select min(s.rowid) from test12 s where t.tid=s.tid group by s.tid);----如果是保留最大的唯一行,换max即可。
TID        TNAME        TTIME        SSEX        ROWID
11        12                                      AAAMP+AAEAAAAC0AAA
111        1a2                                     AAAMP+AAEAAAAC0AAB
21        2121                    2012-11-13 15:30:45                AAAMP+AAEAAAAC0AAC
23        2121                    2012-11-13 15:41:31        女        AAAMP+AAEAAAAC0AAE

删除方法二:失败!
delete test12 t where t.rowid in (select s.rowid from test12 s where s.tid=t.tid and s.rowid>t.rowid);

解:
由于这个例子的特殊性,所以select s.tid,s.rowid from test12 s,test12 t where s.rowid>t.rowid and t.tid=s.tid;

select s.tid,s.rowid from test12 s,test12 t where s.rowid<t.rowid and t.tid=s.tid;可以查询出来正确的结果。

测试:
insert into test12 values(23,'fsf',sysdate,'F');
insert into test12 values(23,'fsf',sysdate,'M');

select t.*,t.rowid from test12 t;
TID        TNAME        TTIME        SSEX        ROWID
11        12                                      AAAMP+AAEAAAAC0AAA
111        1a2                                     AAAMP+AAEAAAAC0AAB
21        2121                    2012-11-13 15:30:45                AAAMP+AAEAAAAC0AAC
21        2121                    2012-11-13 15:41:18        男        AAAMP+AAEAAAAC0AAD
23        2121                    2012-11-13 15:41:31        女        AAAMP+AAEAAAAC0AAE
23        2121                    2012-11-13 15:41:48        nv        AAAMP+AAEAAAAC0AAF
23        fsf                     2012-11-14 10:09:14        F         AAAMP+AAEAAAAC2AAA
23        fsf                     2012-11-14 10:11:50        M         AAAMP+AAEAAAAC2AAB

错误结果一:
select s.tid,s.rowid from test12 s,test12 t where s.rowid>t.rowid and t.tid=s.tid;
21        AAAMP+AAEAAAAC0AAD
23        AAAMP+AAEAAAAC2AAB
23        AAAMP+AAEAAAAC2AAA
23        AAAMP+AAEAAAAC0AAF
23        AAAMP+AAEAAAAC2AAB
23        AAAMP+AAEAAAAC2AAA
23        AAAMP+AAEAAAAC2AAB

错误结果二:
select s.tid,s.rowid from test12 s,test12 t where s.rowid<t.rowid and t.tid=s.tid;
21        AAAMP+AAEAAAAC0AAC
23        AAAMP+AAEAAAAC0AAE
23        AAAMP+AAEAAAAC0AAF
23        AAAMP+AAEAAAAC0AAE
23        AAAMP+AAEAAAAC2AAA
23        AAAMP+AAEAAAAC0AAF
23        AAAMP+AAEAAAAC0AAE

由于是比较,两个表,以笛卡尔积的方式,进行对比,取小的rowid(错误二的例子),首选s表的第一行(tid为23第一行)AAAMP+AAEAAAAC0AAE
与t表的第一比较,相等,无结果;与第二行,第三行,第四行(tid为23的四行),均最小,则,有三条结果;然后s表的第二行开始比较,比t表的第一行大,与第二行相等,比第三、四行相等,则有两条结果;然后s表的第三行,再去比较,比t表的第一、二行都大,与第三行相等,比第四行小,所以一条结果;s表第四行比t表第一、二、三行都大,与第四行相等,所以无结果。综上所述,最终结果(无序的)为:
21        AAAMP+AAEAAAAC0AAC
23        AAAMP+AAEAAAAC0AAE
23        AAAMP+AAEAAAAC0AAF
23        AAAMP+AAEAAAAC0AAE
23        AAAMP+AAEAAAAC2AAA
23        AAAMP+AAEAAAAC0AAF
23        AAAMP+AAEAAAAC0AAE


补充:如果要指定删除重复(tid)行为4(N)行以上的,保留最小的行,其他的删除。
则在where后增加rowid not in (select min(rowid) from test12 group by tid having count(*) >4) and tid in (select tid from test12 group by tid having count(*) >4);这种方法更加灵活,可以实现的功能更多。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-247234-1-1.html 上篇帖子: Oracle中删除分类 下篇帖子: oracle创建用户及授权
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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