如何删除一个表中两个完全一样的数据(只删其中一条)

时间:2021-10-27 21:42:39
比如说有两条记录
   yhbh     bgxm         bgrq        bgqnr     bghnr 
   121909  经营状态   26-12月-02     营业       注销  
   121909  经营状态   26-12月-02     营业       注销 

17 个解决方案

#1


rownum可以么?我怕误删除(把其他的删了)

#2


查询重复记录的语句
select rowid,bdsszd from BADWDJ a where a.rowid != (select max(rowid) from BADWDJ b where a.bdsszd =b.bdsszd) 

这个你可能能用着

#3


http://www.oradb.net/sql/find0.htm

#4


delete from a where rowid!=(select max(rowid) from a b where a.yhbh =b.yhbh and a.bgxm=b.bgxm and.......);

#5


rowid一定不同,可以用delete from ... where rowid =
其实用rownum也是可以的.如果两条记录重复,可以用
delete from ... where rownum=1
不过这样的方法比较老土.

#6


删除重复列的方法

(1) DELETE FROM table_name A WHERE ROWID > (
       SELECT min(rowid) FROM table_name B
        WHERE A.key_values = B.key_values);
(2) create table table2 as select distinct * from table1;
     drop table1;
     rename table2 to table1;
(3) Delete from mytable where rowid not in(
       select max(rowid) from mytable
       group by column_name );
(4) delete from mytable t1
      where  exists (select 'x' from my_table t2
                   where t2.key_value1 = t1.key_value1
                     and t2.key_value2 = t1.key_value2
                     ...
                     and t2.rowid > t1.rowid);

#7


delete from ... where rownum=1

#8


luckysxn(风花雪)
个人认为他的方案不错---全,hehehehe

#9


luckysxn(风花雪) 大侠讲得很清楚啦:
(1) DELETE FROM table_name A WHERE ROWID > (
       SELECT min(rowid) FROM table_name B
        WHERE A.key_values = B.key_values);
(2) create table table2 as select distinct * from table1;
     drop table1;
     rename table2 to table1;
(3) Delete from mytable where rowid not in(
       select max(rowid) from mytable
       group by column_name );

#10


delete from table_name a 

where rowid< (select max(rowid) from table_name 

where column1=a.column1 and column2=a.column2 

and colum3=a.colum3 and ...);  

#11


delete from table_name
where 主键 in
(select a.主键 from table_name a,table_name b
 where a.主键=b.主键 
 and a.rowid <>b.rowid)

#12


其实这种情况完全用不到那么麻烦!只要这样一条命令就可以了,保证安全,不会有任何危险!!!

create table another_table as select distinct * from table_name;

这样another_table就是删除了重复记录的表!

这个问题是解决了,不过我得提醒你,最好在你的表上建一个主键,以此来杜绝下次再出现类似问题。要知道,管理软件最怕业务记录出现问题,可能开始编写一个程序比简单,但是如果数据出现了毛病,那么后期的维护工作完全可以把你拖垮!!!

#13


根据rowid

#14


liu7537(一飞) 
你的方法也有问题的

你这样只能删除所有列都相同的,而实际上重复数据指的是 本应作为主键的字段有重复数据,其他字段则不考虑

比如:
表a
___________
id1 number
id2 number
value varchar2(10)

本来的主键应该为(id1,id2)
但现在里面有这样的数据
id1   id2    value 
--------------------
1      1     a
1      1     b
这样根据你的方法就不能删除了

解决办法:

delete from a b
 where rowid != (select max(rowid) 
                   from a c 
                  where id1 = b.id1
                    and id2 = b.id2);




#15


完全同意 xinpingf(白开心) 的观点

#16


你这样只能删除所有列都相同的,而实际上重复数据指的是 本应作为主键的字段有重复数据,其他字段则不考虑


如果存在这样的数据?那你这个数据哭还设计主关键字做什么?
关系型数据库还有什么用?

#17


同意楼上的!

俺就纳闷了,如果你建库建表的时候都考虑到约束,即使只满足第二范式,那怎么会有什么重复记录???

#1


rownum可以么?我怕误删除(把其他的删了)

#2


查询重复记录的语句
select rowid,bdsszd from BADWDJ a where a.rowid != (select max(rowid) from BADWDJ b where a.bdsszd =b.bdsszd) 

这个你可能能用着

#3


http://www.oradb.net/sql/find0.htm

#4


delete from a where rowid!=(select max(rowid) from a b where a.yhbh =b.yhbh and a.bgxm=b.bgxm and.......);

#5


rowid一定不同,可以用delete from ... where rowid =
其实用rownum也是可以的.如果两条记录重复,可以用
delete from ... where rownum=1
不过这样的方法比较老土.

#6


删除重复列的方法

(1) DELETE FROM table_name A WHERE ROWID > (
       SELECT min(rowid) FROM table_name B
        WHERE A.key_values = B.key_values);
(2) create table table2 as select distinct * from table1;
     drop table1;
     rename table2 to table1;
(3) Delete from mytable where rowid not in(
       select max(rowid) from mytable
       group by column_name );
(4) delete from mytable t1
      where  exists (select 'x' from my_table t2
                   where t2.key_value1 = t1.key_value1
                     and t2.key_value2 = t1.key_value2
                     ...
                     and t2.rowid > t1.rowid);

#7


delete from ... where rownum=1

#8


luckysxn(风花雪)
个人认为他的方案不错---全,hehehehe

#9


luckysxn(风花雪) 大侠讲得很清楚啦:
(1) DELETE FROM table_name A WHERE ROWID > (
       SELECT min(rowid) FROM table_name B
        WHERE A.key_values = B.key_values);
(2) create table table2 as select distinct * from table1;
     drop table1;
     rename table2 to table1;
(3) Delete from mytable where rowid not in(
       select max(rowid) from mytable
       group by column_name );

#10


delete from table_name a 

where rowid< (select max(rowid) from table_name 

where column1=a.column1 and column2=a.column2 

and colum3=a.colum3 and ...);  

#11


delete from table_name
where 主键 in
(select a.主键 from table_name a,table_name b
 where a.主键=b.主键 
 and a.rowid <>b.rowid)

#12


其实这种情况完全用不到那么麻烦!只要这样一条命令就可以了,保证安全,不会有任何危险!!!

create table another_table as select distinct * from table_name;

这样another_table就是删除了重复记录的表!

这个问题是解决了,不过我得提醒你,最好在你的表上建一个主键,以此来杜绝下次再出现类似问题。要知道,管理软件最怕业务记录出现问题,可能开始编写一个程序比简单,但是如果数据出现了毛病,那么后期的维护工作完全可以把你拖垮!!!

#13


根据rowid

#14


liu7537(一飞) 
你的方法也有问题的

你这样只能删除所有列都相同的,而实际上重复数据指的是 本应作为主键的字段有重复数据,其他字段则不考虑

比如:
表a
___________
id1 number
id2 number
value varchar2(10)

本来的主键应该为(id1,id2)
但现在里面有这样的数据
id1   id2    value 
--------------------
1      1     a
1      1     b
这样根据你的方法就不能删除了

解决办法:

delete from a b
 where rowid != (select max(rowid) 
                   from a c 
                  where id1 = b.id1
                    and id2 = b.id2);




#15


完全同意 xinpingf(白开心) 的观点

#16


你这样只能删除所有列都相同的,而实际上重复数据指的是 本应作为主键的字段有重复数据,其他字段则不考虑


如果存在这样的数据?那你这个数据哭还设计主关键字做什么?
关系型数据库还有什么用?

#17


同意楼上的!

俺就纳闷了,如果你建库建表的时候都考虑到约束,即使只满足第二范式,那怎么会有什么重复记录???