如何删除表中重复的记录?

原题(不知道怎么回事:( 突然出现了2千多条一模一样的记录:(应该如何删除基本的一条? )

---------------------------------------------------------------
找出某一字段重复的所有记录:
SELECT * FROM 你的表名 WHERE 字段1 IN (SELECT 字段1 FROM 你的表名 GROUP BY 字段1 HAVING count(*)>1) ORDER BY 字段1

某几个字段或全部字段重复,保留1条记录(只适合DBF表):

INDEX ON 字段1+字段2+...+字段N TO TEMP1 &&如果有字段不是字符型,请注意转换。
TOTAL ON 字段1+字段2+...+字段N1 TO TEMP2 FIELDS 字段1 &&假设字段1为字符型
&&ON 后的字段为重复的字段名
&&temp2.dbf就是你要的表

如果你的表是SQL中的表,而且所有字段均重复的记录,用以下方法:
SQLEXEC(LJSql,"SELECT DISTINCT * into Tmp FROM 你的表")
SQLEXEC(LJSql,"DROP TABLE 你的表")
SQLEXEC(LJSql,"SELECT * into 你的表 FROM Tmp")
SQLEXEC(LJSql,"DROP TABLE Tmp")

注意:LJSql 为LJSql=SQLCONNECT() 连接SQL数据源的连接句柄

如何删除重复记录

以下就重复记录删除的问题作一阐述。

有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。
1、对于第一种重复,比较容易解决,使用
select distinct * from tableName
就可以得到无重复记录的结果集。
如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除
SQLEXEC(LJSql,"SELECT DISTINCT * into Tmp FROM kq_yg")
SQLEXEC(LJSql,"DROP TABLE kq_yg")
SQLEXEC(LJSql,"SELECT * into kq_yg FROM Tmp")
SQLEXEC(LJSql,"DROP TABLE Tmp")
注:这里的tmp和kq_yg均为SQL中的表

发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。

2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下
假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集
select identity(int,1,1) as autoID, * into #Tmp from tableName
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID
select * from #Tmp where autoID in(select autoID from #tmp2)
最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)

Published At
Categories with 数据库类
Tagged with
comments powered by Disqus