再论删除表中重复的行

设表的结构为

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字段重复,而其他字段不一定重复或都重复可以忽略。   这种情况是第一种情况的特殊例子,只要把相应的字段缩小为关键字重复的列名即可。 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值