--参考:一张表里面以两个字段为唯一字段,当几条记录的这两个字段完全相同时,需要删除重复项,如下表   
  a   b   c   d   
  1   2   3   4   
  1   5   3   5   
  1   2   7   9   
  以a、b为唯一字段,第一条和第三条的a、b完全相同,所以,需要删除第一条记录1   2   3   4   或者第三条记录1   2   7   9   
  即如下结果:   
  a   b   c   d   
  1   2   3   4   
  1   5   3   5   
  或   
  a   b   c   d   
  1   5   3   5   
  1   2   7   9   
    
  请问各位大侠这种sql语句怎么写   
    
    
  CREATE   TABLE   Tb1(id   int,   [a]   varchar(255),   [b]   varchar(255),   [c]   varchar(255),   [d]   varchar(255))   
  INSERT   Tb1(id,   [a],   [b],   [c],   [d])   
                        SELECT   1,   '1','2','3','4'   
  UNION   ALL     SELECT   2,   '1','5','3','5'   
  UNION   ALL     SELECT   3,   '1','2','7','9'   
  UNION   ALL     SELECT   4,   '1','4','7','6'   
    
  delete   Tb1   where   [id]   not   in   (select   max([id])   from   Tb1   group   by   a,b   )   
  select   *   from   tb1   
      
  drop   table   tb1   
    
  如果要同时删除第一和第三行   
  即如下结果:   
  a   b   c   d   
  1   5   3   5   
    
  语句如下:   
    
  delete   m   from   tb   t   
  inner   join   
  (   
  select   a   ,b   
  from   tb   
  group   by   a   ,   b   
  having   count(*)>1   
  )n   
  on   m.a   =   n.a   and   m.b   =   n.b     
  或   
  delete   *   from   tb   as   m,   
  (   
  select   a   ,b   
  from   tb   
  group   by   a   ,   b   
  having   count(*)>1   
  )n   
  where   m.a   =   n.a   and   m.b   =   n.b
在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢?谢谢!   
  1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断   
  select   *   from   people   
  where   peopleId   in   (select     peopleId     from     people     group     by     peopleId     having     count(peopleId)   >   1)   
    
  2、删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录   
  delete   from   people     
  where   peopleId     in   (select     peopleId     from   people     group     by     peopleId       having     count(peopleId)   >   1)   
  and   rowid   not   in   (select   min(rowid)   from     people     group   by   peopleId     having   count(peopleId   )>1)   
    
  3、查找表中多余的重复记录(多个字段)     
  select   *   from   vitae   a   
  where   (a.peopleId,a.seq)   in     (select   peopleId,seq   from   vitae   group   by   peopleId,seq     having   count(*)   >   1)   
    
  4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录   
  delete   from   vitae   a   
  where   (a.peopleId,a.seq)   in     (select   peopleId,seq   from   vitae   group   by   peopleId,seq   having   count(*)   >   1)   
  and   rowid   not   in   (select   min(rowid)   from   vitae   group   by   peopleId,seq   having   count(*)>1)   
    
  5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录   
  select   *   from   vitae   a   
  where   (a.peopleId,a.seq)   in     (select   peopleId,seq   from   vitae   group   by   peopleId,seq   having   count(*)   >   1)   
  and   rowid   not   in   (select   min(rowid)   from   vitae   group   by   peopleId,seq   having   count(*)>1)   

解决方案 »

  1.   


    delete a
    from  #tmp a
    where exists( select 1 from TableA where phone =a.phone ) 
      

  2.   

    delete #tmp 
    from TableA 
    inner join TableA
    on [#tmp].phone=TableA.phone 
      

  3.   

    我要说的是你分3部的做法很好
    delete #tmp 
    from TableA 
    inner join TableA 
    on [#tmp].phone=TableA.phone第二步改写为上边的写法也许有帮助
      

  4.   

    delete from tb
    where id not in(select max(id) from tb group by 字段)
      

  5.   

    谢谢大家的回复,我会认真研究,并希望能集思广益,毕竟就我个人认为删除重复数据在sql操作里会经常碰到。
      

  6.   

    感觉在这个问题中,几次测试下来,in < exists < inner join