delete from stab where rowid not in
(select min(rowid) from stab 
group by cl1,cl2
having count(*)>1)
这样直接写就可以了

解决方案 »

  1.   

    这里rowid可以改成别的只要是不重复的属性就可以
      

  2.   


    delete stab 
    from stab  t1 
    inner join 
    (
      select *,row_number() over(partition by cl1,cl2 order by cl1) as row 
      from stab
    ) t2
    on t1.cl1 = t2.cl1 
       and t1.cl2 = t2.cl2 where t2.row >1
      

  3.   

    rowid不识别,我用的是sqlserver2008 R2,这个里面美誉哦row,rowid 之类的东西row 也不识别呢
      

  4.   


    哦,由于上面的帖子里的rowid是oracle专用的,所以我的代码中通过row_number()函数来动态算出来,新增为row这一列,那么这样就可以了。
      

  5.   

    我试了一下,上面的代码确实还有点问题,我改了一下:create table stab(cl1 int,cl2 int,cl3 varchar(10),cl4 varchar(10))--truncate table stabinsert stab (cl1,cl2,cl3,cl4)
    values(1,1,'a','b'),
          (1,2,'e','f'),
          
          (2,1,'c','d'),
          
          (3,1,'e','f'),
          (3,2,'a','b'),
          
          (2,1,'重复数据','d'),   --与第2条数据重复重复数据
          
          (1,1,'重复数据','f')    --与第1条数据重复数据
          select *
    from stab
    --会删除cl1和cl2这两列的数据相同的行,cl3和cl4列可以不同
    --delete stab with t1
    as
    (
      select *,row_number() over(partition by cl1,cl2 order by cl1) as row 
      from stab
    )delete t1
    from t1 
    inner join t1 as t2
    on t1.cl1 = t2.cl1 
       and t1.cl2 = t2.cl2 
       and t1.row = t2.rowwhere t2.row >=2 
      

  6.   

    sqlserver2008 row_number()不识别,怎么破