oracle rowid会重复吗,巧用rowid来删除重复记录

巧用rowid来删除重复记录

第一:当重复的记录只有1条时:

在oracle中,每一条记录都有一个rowid,rowid在整个数据库中是唯一的,

rowid确定了每条记录是oracle中的哪一个数据文件、块、行上。在重复的记录中,

可能所有列的内容都相同,但rowid不会相同。

SQL> select * from tt;

NAME              AGE ID

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

赵                 33 1003

王                 44 1004

张三               20 1000

李四               26 1001

张三               20 1002

SQL> insert into tt values('赵',33,'1003');

已创建 1 行。

SQL> commit;

提交完成。

SQL> select rowid,tt.* from tt;

ROWID              NAME              AGE ID

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

AAAR7MAAEAAAACzAAA 赵                 33 1003

AAAR7MAAEAAAAC1AAA 赵                 33 1003

AAAR7MAAEAAAAC1AAD 王                 44 1004

AAAR7MAAEAAAAC2AAA 张三               20 1000

AAAR7MAAEAAAAC2AAB 李四               26 1001

AAAR7MAAEAAAAC2AAC 张三               20 1002

已选择6行。

SQL> select t1.rowid,t2.rowid,t1.* from tt t1,tt t2 where t1.rowid>t2.rowid and t1.id=t2.id

2  /

ROWID              ROWID              NAME              AGE ID

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

AAAR7MAAEAAAAC1AAA AAAR7MAAEAAAACzAAA 赵                 33 1003

SQL> delete from tt t where exists (select t1.rowid from tt t1,tt t2

2  where t1.rowid>t2.rowid and t1.id=t2.id and t.rowid=t1.rowid)

3  /

已删除 1 行。

SQL> select rowid,tt.* from tt;

ROWID              NAME              AGE ID

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

AAAR7MAAEAAAACzAAA 赵                 33 1003

AAAR7MAAEAAAAC1AAD 王                 44 1004

AAAR7MAAEAAAAC2AAA 张三               20 1000

AAAR7MAAEAAAAC2AAB 李四               26 1001

AAAR7MAAEAAAAC2AAC 张三               20 1002

SQL>

当重复记录有N条时:

可以使用max或者min聚合函数

SQL> select * from tt;

NAME              AGE ID

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

赵                 33 1003

赵                 33 1003

赵                 33 1003

王                 44 1004

张三               20 1000

李四               26 1001

张三               20 1002

已选择7行。

SQL> delete from tt where rowid not in (select max(rowid) from tt t1 group by id);

已删除2行。

SQL> select * from tt;

NAME              AGE ID

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

赵                 33 1003

王                 44 1004

张三               20 1000

李四               26 1001

张三               20 1002

SQL>

另外也可以这样:delete from tt t where rowid>(select min(rowid) from tt where t.id=tt.id)

点评:这个技巧能大大地提高删除重复行的效率!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值