上次笔试,有个这样的题目:要求从数据库中查出所有重复记录,并将重复记录从数据库中删除,而且保证在数据库中有一条数据。请问大大们给点思路我。(不要说distinct能删除啊,我用过了,它只是查询出没有重复记录,但是并没有在数据库里面删除。这个必须要用到存储过吧。但我没有思路,哪位大大可以给点思路,谢谢)

解决方案 »

  1.   


    delete from A a where a.rowid!=(select max(rowid) from A b where a.bm=b.bm and a.mc=b.mc);
      

  2.   

    delete from A a 能执行起来吗?
      

  3.   

    你自己在SQL SERVER里试下不行吗?
      

  4.   

    哦,sql server2000中delete 和 from中间要加上引用的别名a
      

  5.   

    好吧,刚才那个错不讨论了,你这算是假定LZ的需求是别的列值都相同,rowid不同,如果两行值完全相同,可能还要再想想!
      

  6.   

    这个``
    开始的时候没有看到是sqlserver,所以写的sql是oracle的,oracle里面rowid是唯一的
    而sqlserver至少到2000为止还没有类似oracle的rowid的伪标识,2005我不知道,也许有
    所以是假定所有的列值都相同
    执行上面的东西之前加个自增的列
    alter table a add row_id int identity(1,1)大致是这么个意思吧
    执行完了之后再drop该列
    alter table a drop column row_id
    比oracle要麻烦多了
      

  7.   

    我用distinct试了下貌似可以,不是删除而是生成了新表我做过示范了如下:create table r(
    id int identity primary key,
    name varchar(20)
    )
    insert into r values('a')
    insert into r values('a2')
    insert into r values('a1')
    insert into r values('a1')
    insert into r values('a1')
    select * from r --查询数据
    select name from r --根据name查询
    select distinct name  from r --查询不相同name的记录
    select distinct name into a1 from r --生成不相同name的a1表
    select * from a1 --查询a1表
    drop table r --删除重复的r表
    select * into r from a1 --生成不重复的r表
    select * from r 
    alter table r add id int identity primary key --给不重复的r表增加新的主键
    select * from r --查看表