重复数据:选择,删除,保留

本文介绍在Oracle 9i数据库中如何处理表peng_tb_vip中的重复数据,包括使用DISTINCT去除整行重复数据、保留最小或最大ROWID的方法以及创建包含最小和最大ROWID的表来保存关键数据。

重复数据:选择,删除,保留min(rowid) max(rowid)

2010-12-30

Database:oracle9i

表:peng_tb_vip

由于表数据太多,不便于选出来,故count;

Select count(*) from peng_tb_vip

SQL> Select count(*) from peng_tb_vip;

COUNT(*)

----------

152

(一):整个行数据重复

如果整个表peng_tb_vip 行重复,则加distinct,,即可去掉重复的数据。

Select distinct * from peng_tb_vip;

(二)多个字段重复

字段:corpid,cust_code;

l 生成临时表

CREATE TABLE PENG_TB_VIP2 AS SELECT * FROM PENG_TB_VIP;

l 删除重复记录,保留最小ROWID

这里用两个字段作为where,a,b必须都是在同表做操作;

DELETE FROM PENG_TB_VIP2 aWHERE ROWID>(SELECT MIN(ROWID) FROM PENG_TB_VIP2 bwhere a.corpid=b.corpidand a.cust_code=b.cust_code);commit;

l 由于是保留最小的ROWid,将表peng_tb_vip2规范一下;

Alter table peng_tb_vip2 rename to peng_tb_vip_min

l 删除重复记录,保留最大的ROWID;

CREATE TABLE PENG_TB_VIP_maxAS SELECT * FROM PENG_TB_VIP;

delete from peng_TB_VIP_MAX AWHERE ROWIDSELECT MAX(ROWID) FROM PENG_TB_VIP_MAX B where a.corpid=b.corpidand a.cust_code=b.cust_code);commit;

l 验证数据,查询数据在column corpid,cust_code是否有重复的

SQL> select corpid,cust_code,vip_name from peng_tb_vip_min;

CORPID CUST_CODE VIP_NAME

-------------------- -------------------- ----------------

RMA ZYSH01 刘婕

XANDER DRFSH01 叶刚

XANDER DRFGD08 刘建荣

XANDER ZYSH01 邓梵

XANDER DRFJS26 徐先生

XANDER DRFJS08 朱广林

XANDER DRFJS16 何庆

XANDER DRFSH04 吴春艺

XANDER ZYZMSH02 张建青

XANDER HYDGD17 覃进飞

XANDER ZYBLAH01 杨平

11 rows selected

通过上面可以看到没有两列都重复的。

查看数据为max(rowid)的表

SQL> select corpid,cust_code,vip_name from peng_tb_vip_max;

CORPID CUST_CODE VIP_NAME

-------------------- -------------------- ----------------

XANDER DRFSH01 陆佳源

XANDER DRFGD08 刘建荣

RMA ZYSH01 邓梵

XANDER DRFJS26 徐先生

XANDER DRFJS16 何庆

XANDER DRFJS08 宜磊

XANDER DRFSH04 李然

XANDER ZYZMSH02 张鹏

XANDER HYDGD17 覃进飞

XANDER ZYSH01 王龙双

XANDER ZYBLAH01 胡安

11 rows selected

从上面可以看出和peng_tb_vip_min表中数据不相同。这里我没有把rowid查询出来。

如果要查询,只要在select 后面加上字段rowid即可。

(三) 有的时候,表中需要存放两条数据,不需要把所有重复数据删除,这时候可以这样做:创建一个表,存有最小ROWID和最大ROWID;

create table peng_tb_vip_min_maxas select * from peng_tb_vip2union allselect * from peng_tb_vip_max;

SQL> select corpid,cust_code,vip_name from peng_tb_vip_min_max;

CORPID CUST_CODE VIP_NAME

-------------------- -------------------- ----------------

RMA ZYSH01 刘婕

XANDER DRFSH01 叶刚

XANDER DRFGD08 刘建荣

XANDER ZYSH01 邓梵

XANDER DRFJS26 徐先生

XANDER DRFJS08 朱广林

XANDER DRFJS16 何庆

XANDER DRFSH04 吴春艺

XANDER ZYZMSH02 张建青

XANDER HYDGD17 覃进飞

XANDER ZYBLAH01 杨平

XANDER DRFSH01 陆佳源

XANDER DRFGD08 刘建荣

RMA ZYSH01 邓梵

XANDER DRFJS26 徐先生

XANDER DRFJS16 何庆

XANDER DRFJS08 宜磊

XANDER DRFSH04 李然

XANDER ZYZMSH02 张鹏

XANDER HYDGD17 覃进飞

CORPID CUST_CODE VIP_NAME

-------------------- -------------------- ----------------

XANDER ZYSH01 王龙双

XANDER ZYBLAH01 胡安

22 rows selected

[@more@]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22934571/viewspace-1043876/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/22934571/viewspace-1043876/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值