怎样删除一个表中的重复行?

jettli 2003-03-14 02:26:32
如题
...全文
141 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
hai_yu2000 2003-03-14
  • 打赏
  • 举报
回复
是伪列
smallcrocodile 2003-03-14
  • 打赏
  • 举报
回复
问一下:
hrb_qiuyb(大森林)

rowid 在那个表里
dajian2000 2003-03-14
  • 打赏
  • 举报
回复
还有个方法: --这个方法可以一次删除所有重复的纪录。
SQL> select * from a;

ID NAME
---------- --------------------
1 zzz
2 HHH
3 JJJ
1 zzz

SQL> select distinct * from a;

ID NAME
---------- --------------------
1 zzz
2 HHH
3 JJJ
SQL> create table zhj as select distinct * from a;

表已创建。
SQL> drop table a;

表已丢弃。
SQL> create table a as select * from zhj;

表已创建。
SQL> select * from a;

ID NAME
---------- --------------------
1 zzz
2 HHH
3 JJJ
shuipipi 2003-03-14
  • 打赏
  • 举报
回复
hrb_qiuyb(大森林) 老师已经讲的淋漓尽致了~

呵呵~
playyuer 2003-03-14
  • 打赏
  • 举报
回复
T(f1,f2,f3)

DELETE T
FROM T,T T1
WHERE T.f1=T1.f1
and T.f2=T1.f2
and T.f3=T1.f3
and T.rowid < T1.rowid
hrb_qiuyb 2003-03-14
  • 打赏
  • 举报
回复
引自www.oradb.net
软件环境:
1、Windows NT4.0+ORACLE 8.0.4
2、ORACLE安装路径为:C:\ORANT

问题提出:
1、当我们想要为一个表创建唯一索引时,如果该表有重复的记录,则无法创建成功。
方法原理:
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

17,377

社区成员

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

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