怎样删除数据库中标有重复的记录

eastflyeagle 2003-12-03 07:18:28
在我的数据库中有一个bonus表,在其中误插入了一些相同的记录,现在我要把这些记录删掉,应该怎样写SQL语句。请大家指教!
...全文
40 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
eastflyeagle 2003-12-05
  • 打赏
  • 举报
回复
多谢大家的指点,特别感谢chanet(牧师) ,因将一个3千多分的账号丢了,这个是新申请的账号,分不多,故不能给大家多加分,在此表示歉意!
chanet 2003-12-03
  • 打赏
  • 举报
回复
方法原理:
1、Oracle中,每一条记录都有一个rowid,rowid在整个数据库中是唯一的,
  rowid确定了每条记录是在ORACLE中的哪一个数据文件、块、行上。

2、在重复的记录中,可能所有列的内容都相同,但rowid不会相同,所以只要确定出重复记录中
  那些具有最大rowid的就可以了,其余全部删除。

3、以下语句用到了3项技巧:rowid、子查询、别名。

实现方法:
SQL> create table a (
2 bm char(4), --编码
3 mc varchar2(20) --名称
4 )
5 /

表已建立.

SQL> insert into a values('1111','1111');
SQL> insert into a values('1112','1111');
SQL> insert into a values('1113','1111');
SQL> insert into a values('1114','1111');

SQL> insert into a select * from a;

插入4个记录.

SQL> commit;

完全提交.

SQL> select rowid,bm,mc from a;

ROWID BM MC
------------------ ---- -------
000000D5.0000.0002 1111 1111
000000D5.0001.0002 1112 1111
000000D5.0002.0002 1113 1111
000000D5.0003.0002 1114 1111
000000D5.0004.0002 1111 1111
000000D5.0005.0002 1112 1111
000000D5.0006.0002 1113 1111
000000D5.0007.0002 1114 1111

查询到8记录.


查出重复记录
SQL> select rowid,bm,mc from a where a.rowid!=(select max(rowid) from a b where a.bm=b.bm and a.mc=b.mc);

ROWID BM MC
------------------ ---- --------------------
000000D5.0000.0002 1111 1111
000000D5.0001.0002 1112 1111
000000D5.0002.0002 1113 1111
000000D5.0003.0002 1114 1111

删除重复记录
SQL> delete from a a where a.rowid!=(select max(rowid) from a b where a.bm=b.bm and a.mc=b.mc);

删除4个记录.

SQL> select rowid,bm,mc from a;

ROWID BM MC
------------------ ---- --------------------
000000D5.0004.0002 1111 1111
000000D5.0005.0002 1112 1111
000000D5.0006.0002 1113 1111
000000D5.0007.0002 1114 1111

l2g32003 2003-12-03
  • 打赏
  • 举报
回复
delete from t
where rowid in ( select rid
from ( select rowid rid,
row_number() over
( partition by @@@ order by rowid ) rn
from t
)
where rn > 1 )
/

@@@ 是你有重复的数值的col
benxie 2003-12-03
  • 打赏
  • 举报
回复
论坛里有好多呀,search "相同的记录"
ern 2003-12-03
  • 打赏
  • 举报
回复
delete from bonus where rowid not in(select max(rowid) from bonus group by 主键)
shanyuliang 2003-12-03
  • 打赏
  • 举报
回复
delete from bonus where rowid not in (select min(rowid) from bonus group by TheKeyColumn);
blueshu 2003-12-03
  • 打赏
  • 举报
回复
用ROWID试试

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧