PK 主键 feild 重复字段SELECT * FROM table WHERE (feild IN (SELECT feild FROM (SELECT MIN(PK) AS PK, feild FROM table GROUP BY feild HAVING (COUNT(PK) > 1)) a)) AND (ID NOT IN (SELECT pk FROM (SELECT MIN(PK) AS pk, feild FROM table GROUP BY feild HAVING (COUNT(PK) > 1)) a)) --------------------- 这句是取出重复的记录 SELECT count(Pk) , feild FROM table GROUP BY feild HAVING COUNT(PK) > 1 ---- count 改成 min 取一个最小的留下 not in 不在最小列表中的 删除----------fest(fest) 写的这句没看懂 试了下应该是错的。
xFeater(宿命使者) 我明白了删一就可以top,删2就max不论是保留第一条记录或者最后一条记录都可以通过top来实现,只不过逆序的时候要添加order by id desc语句
可以啊,选将数据库中的相同的数赋值给一个变量,然后再用Delete 将其删除就可以了
delete from tbl awhere rowid<(select max(b.rowid) from tbl b where a.col1=b.col1 and a.col2 = b.col2);
其它人的全部是錯的 只有 plmsoft 的方法可以
方法一 declare @max integer,@id integer declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 1 open cur_rows fetch cur_rows into @id,@max while @@fetch_status=0 begin select @max = @max -1 set rowcount @max delete from 表名 where 主字段 = @id fetch cur_rows into @id,@max end close cur_rows set rowcount 0方法二有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。 1、对于第一种重复,比较容易解决,使用 select distinct * from tableName 就可以得到无重复记录的结果集。 如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除 select distinct * into #Tmp from tableName drop table tableName select * into tableName from #Tmp drop table #Tmp 发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。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子句中省去此列)呵呵,在别的地方刚看到的
1 aaa
2 aaa楼主你是想删1还是想删2
不懂了你了.
WHERE (feild IN
(SELECT feild
FROM (SELECT MIN(PK) AS PK, feild FROM table GROUP BY
feild HAVING (COUNT(PK) > 1)) a))
AND (ID NOT IN
(SELECT pk
FROM (SELECT MIN(PK) AS pk, feild FROM table
GROUP BY feild
HAVING (COUNT(PK) > 1)) a))
---------------------
这句是取出重复的记录
SELECT count(Pk) , feild FROM table
GROUP BY feild
HAVING COUNT(PK) > 1
---- count 改成 min 取一个最小的留下 not in 不在最小列表中的 删除----------fest(fest) 写的这句没看懂 试了下应该是错的。
我明白了删一就可以top,删2就max不论是保留第一条记录或者最后一条记录都可以通过top来实现,只不过逆序的时候要添加order by id desc语句
declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 1
open cur_rows
fetch cur_rows into @id,@max
while @@fetch_status=0
begin
select @max = @max -1
set rowcount @max
delete from 表名 where 主字段 = @id
fetch cur_rows into @id,@max
end
close cur_rows
set rowcount 0方法二有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。
1、对于第一种重复,比较容易解决,使用
select distinct * from tableName
就可以得到无重复记录的结果集。
如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除
select distinct * into #Tmp from tableName
drop table tableName
select * into tableName from #Tmp
drop table #Tmp
发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。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子句中省去此列)呵呵,在别的地方刚看到的