设表的结构为
create table employee
( emp_no int,
emp_lname char(10),
emp_fname char(10),
dept_no char(10))
删除表中重复的行有以下种情况:
1、完全重复的记录,也即所有字段均重复的记录。 删除时有两种情况:
1)、删除所有重复的行
delete from employee
where emp_no in (select emp_no from @tb1 group by emp_no having count(*) > 1)
这种方法在数据库中有这样的数据时:1 aaa smith d1
1 jone smith d1
1 jone smith d1 该方法也会把第一行的数据也会删掉,所以应该使用下面这种方法: delete m from employee m inner join (select emp_no,emp_lname from employee group by emp_no,emp_lname having count(*)>1 ) n on m.emp_no = n.emp_no and m.emp_lname = n.emp_lname
如果是所有字段均重复,则可以把所有的列名进行重复
2)、对重复的行保留其中的一行
一般的做法是在表中设一个字段rowid来表示行的行数,那么在删除的时候使用min(rowid)来把其中的一行过滤掉。 delete from employee where emp_no in (select emp_no from @tb1 group by emp_no having count(*) > 1) and rowid not in (select min(rowid) from @tb1 group by emp_no having count(*)>1)
但是如果没有该rowid字段时,则不能使用这种发放,因为没有办法过滤其中的一行。此时就需要借助于一张临时表,方法是把不重复的记录先放在临时表中,然后删除表中所有的数据,再从临时表中把数据取回即可。 select distinct * into tmp from employee delete from employee insert into employee select * from tmp 2、二是部分关键字段重复的记录,比如employee字段重复,而其他字段不一定重复或都重复可以忽略。 这种情况是第一种情况的特殊例子,只要把相应的字段缩小为关键字重复的列名即可。