有ceshi表 :
需要把表中TITLE,BOOK_SEARC这两个字段重复的记录删除,只保留一条数据 .写了这个SQL语句 :
 delete  ceshi where (TITLE,BOOK_SEARC) in (select TITLE,BOOK_SEARC from ceshi group by TITLE,BOOK_SEARC having count(*)>1)
             and BOOK_BARCO not in(select min(BOOK_BARCO) from ceshi group by TITLE,BOOK_SEARC having count(*)>1)会提示语法错误,请各位大侠指点一下.该如何实现这个功能?还有就是我表中的数据是百万条的记录,如何删除才能提高执行效率,缩短时间.谢谢各位了!

解决方案 »

  1.   

    http://write.blog.csdn.net/postlist进我博客里面看,好多方法
      

  2.   

    delete ceshi 
    where BOOK_BARCO in 
    (select BOOK_BARCO 
    from (select *,rn=row_number() over(partition by TITLE,BOOK_SEARC order by BOOK_BARCO) from tb)t
    where rn>1
    )
      

  3.   


    --如果是两个字段那么要合并,你的语句可以这样改:
    delete  ceshi 
    where TITLE+'$$'+BOOK_SEARC in (select TITLE+'$$'+BOOK_SEARC from ceshi group by TITLE+'$$'+BOOK_SEARC having count(*)>1)
        and BOOK_BARCO not in(select min(BOOK_BARCO) from ceshi group by TITLE,BOOK_SEARC having count(*)>1)
      

  4.   

    楼主,你的sql语句的语法是oracle里面的语法: 
     (TITLE,BOOK_SEARC) in (select TITLE,BOOK_SEARC from ceshi group by TITLE,BOOK_SEARC having count(*)>1)如果是在sql server中,肯定是要报错的,建议你用下面的sql语句,就可以删除重复数据了,试试:
    with t
    as
    (
    select *,
           row_number() over(paritition by TITLE,BOOK_SEARC 
                             order by TITLE) as rown
    from ceshi
    )
    delete from t
    where rown = 2
      

  5.   

    考虑到可能有多条数据,两个字段都一样,稍微改一下:
    with t
    as
    (
    select *,
           row_number() over(paritition by TITLE,BOOK_SEARC 
                             order by TITLE) as rown
    from ceshi
    )
    delete from t
    where rown > 2
      

  6.   

    where如果使用了多列来做in,需要用exists替换
      

  7.   

     DELETE ceshi
     WHERE  EXISTS ( SELECT 1
                     FROM   ( SELECT    TITLE ,
                                        BOOK_SEARC
                              FROM      ceshi
                              GROUP BY  TITLE ,
                                        BOOK_SEARC
                              HAVING    COUNT(*) > 1
                            ) b
                     WHERE  ceshi.title = b.title
                            AND ceshi.book_searc = b.book_searc )
      

  8.   

    再改一下,是大于1的,都删除掉:with t
    as
    (
    select *,
           row_number() over(paritition by TITLE,BOOK_SEARC 
                             order by TITLE) as rown
    from ceshi
    )
    delete from t
    where rown > 1
      

  9.   


    select *
    into temp_ceshi
    from
    (
    select *,ROW_NUMBER() over(partition by TITLE,BOOK_SEARC ,order by getdate()) rn
    from ceshi
    ) t
    where rn=1用上面这个语句把结果存放到 temp_ceshi表。这个表里就是你需要的结果了。然后把表名改成ceshi。重复数据就去掉了