过滤掉所有多余的重复记录 (1)我们知道distinct、group by 可以过滤重复,于是就有最直观的 select distinct * from emp 或 select name,age from emp group by name,age 获得需要的数据,如果可以使用临时表就有解法: select distinct * into #tmp from emp
delete from emp
insert into emp select * from #tmp (2)但是如果不可以使用临时表,那该怎么办? 我们观察到我们没办法区分数据(物理位置不一样,对 SQL Server来说没有任何区别),思路自然是想办法把数据区分出来了,既然现在的所有的列都没办法区分数据,唯一的办法就是再加个列让它区分出来,加什么列好?最佳选择是identity列: alter table emp add chk int identity(1,1 ) 例表: name age chk
Tom 161
Sun 142
Tom 163
Tom 164 重复记录可以表示为: select * from emp where (select count(*) from emp e where e.name=emp.name)>1 要删除的是: delete from emp
where (select count(*) from emp e where e.name=emp.name and e.chk>=emp.chk)>1 再把添加的列删掉,出现结果。 alter table emp drop column chk (3)另一个思路: 视图 select min(chk) from emp group by name having count(*) >1 获得有重复的记录chk最小的值,于是可以 delete from emp where chk not in (select min(chk) from emp group by name)