在平时的开发中,我们经常会遇到数据表中出现重复数据的情况,那么如何解决呢?本文介绍了两种情况下的重复数据删除方法:一是完全重复数据删除;第二,一些字段数据是重复的。
第一,完全重复数据删除的方法
以下SQL语句可用于表中的完整重复数据删除。
Code
TruncateTABLE表名;-清空原始表格数据
drop table“# temp”;-删除临时表
具体思路是先创建一个临时表,然后将DISTINCT后的表数据插入到这个临时表中;然后清除原始表格数据;然后将临时表中的数据插入到原始表中;最后,删除临时表。
第二,一些重复数据删除方法
首先找到重复的数据。
Select field 1, field 2, and count (*). Group by field 1 from table name, and field 2 has count (*) 1.
把上面的数字改成=就可以查到数据,不用重复。
想要删除这些重复的数据,可以使用下面的语句来删除:
Delete from table name A where field 1, field 2in.
上面的语句很简单,就是删除查询到的数据。但是这种删除效率非常低,对于大量的数据,可能会卡数据库。
基于以上情况,可以先将找到的重复数据插入到一个临时表中,然后再删除,这样删除的时候就不需要重新查询了。如下所示:
Creating a table temporary table is like
可以删除以下内容:
在删除之前创建一个临时表比用一条语句直接删除要高效得多。
上述语句将删除所有重复项。在oracle中,有一个自动隐藏的rowid,它给每个记录一个唯一的rowid。如果我们想保留最新的记录,我们可以使用这个字段。
只保留重复数据中rowid最大的记录。
以下是查询重复数据的示例:
selecta.rowid,a.*from表名a
wherea.rowid !=
(
selectmax(b.rowid)from表名b
在那里。字段1=B .字段1和
A.字段2=B .字段2
)
上面括号中的语句是重复数据中rowid最大的记录。而外部是找出除rowid最大值以外的其他重复数据。
因此,我们需要删除重复的数据,只保留最新的数据,所以我们可以这样写:
删除自表名A的
wherea.rowid !=
(
selectmax(b.rowid)from表名b
在那里。字段1=B .字段1和
A.字段2=B .字段2
)
同理,上述代码的执行效率毕竟较低,可以考虑建立一个临时表,将需要判断为重复的字段和rowid插入临时表中,删除时再进行比较。
Creating a table temporary table is like
Choose a. Field 1, a. Field 2, MAX(a.ROWID) dataidfrom the official table aGROUPBYa. Field 1, a. Field 2;
Delete from table name a
wherea.rowid !=
(
selectb.dataidfrom临时表b
在那里。字段1=B .字段1和
A.字段2=B .字段2
);
commit;