ACCESS中有数据库FZX,FZX中有表USER0,USER0中有ID,FDQ,FZX,DZ,NEWFZX,NEWDZ。FZX的记录不是唯一的。
QUERY2.Close;
QUERY2.SQL.Clear;
QUERY2.SQL.Add('delele from user0 where id in (select min(id) from user0 group by fzx)');
QUERY2.ExecSQL;
我试过删除1万多条记录要用7分多钟。等得象死机一样。有时候还一执行就死机。
不知哪位高手有更高效率的SQL语句?

解决方案 »

  1.   

    同意楼上的,还有不要用in,最好用exists要快很多
      

  2.   

    ACCESS数据库本来对大数据量操作就慢,用楼上两位的方法试试,也许也好点。
    不过,最好还是用SQL Server好些。
      

  3.   

    SQL语句不好,那种方式本来就会比较慢
      

  4.   

    不知哪位高手有更高效率的SQL语句
      

  5.   

    access本身就很慢 。不是sql的问题。
      

  6.   

    关注
     要不你大型数据库如(sql server)等等
      

  7.   

    1W条记录还用access?换sqlserver吧
      

  8.   

    用大型的DB没必要。请问用EXISTS如何写?
      

  9.   

    又让我看见了delele from user0 a where id in (select min(id) from user0 b where b.id = a.id group by fzx)
      

  10.   

    写错了delele from user0 a where exists (select min(id) from user0 b where b.id = a.id group by fzx)
      

  11.   

    请问 aA和 b各表示什么?
      

  12.   

    delele from user0 a where exists (select min(id) from user0 b where b.id = a.id group by fzx)
    我用上面的句子,结果把所有的记录都删除了。有没有更好更快的方法啊?
      

  13.   

    都删除了?不会吧,应该只删除各个fzx中最小的id 阿执行一下看看,获得的数据是不是对的:
    select min(id) from user0 b group by fzx然后在执行:
    select id from user0 a where exists (select min(id) from user0 b where a.id = b.id group by fzx)
    看看获得的数据是不是正确的,最后执行删除:
    delele from user0 a where exists (select min(id) from user0 b where a.id = b.id group by fzx)
      

  14.   

    ACCESS处理一万多条数据算是多了...
         你不妨把数据库压缩后看看...
      

  15.   

    干吗用access呢?
    也可以用msde啊
      

  16.   

    你的工程是否很小,access本来数据库性能就不怎么样
    如果是中小型的数据库可以用sql server
    大型的就要用o9i和sybase了记得,表中一定要有主键和索引,可以加快速度
      

  17.   

    to hndj(柳柳荷叶清清水):
         1、 我是想保留各个fzx中最小的id的记录啊,你却相反。
         2、在上面的三句中。第一句没有问题,第二句却少了5个记录。第三句还是把所有的记录都给删除了。
         哪位大虾还有更好的方法????????
      

  18.   

    不要用in,那样的话执行时间是前一个的时间乘后一个select的时间,太费了
    用索引比较方便,就象在数据结构的循环链表里定义头尾指针一样,那样即方便,效率又高!
      

  19.   

    如果是保留那就改一下吧
    delele from user0 a where exists (select min(id) from user0 b where a.id <> b.id group by fzx)
      

  20.   

    to nhdj(柳柳荷叶清清水):
         你的代码执行起来和我原来的代码一样慢啊。在ACCESS下难道真的没有了更快的方法了吗?
      

  21.   

    我觉得你可以这么做:
    如果需要删除的数据比较多,你可以先将需要保留的数据先放置到一个临时表中,然后删除原先的表,最后再恢复那些保留的数据
    select * from user0 where id in (select min(id) from user0 group by fzx) into tmp1
    drop user0
    select * from tmp1 into user0
    drop tmp1
      

  22.   

    to hhzh426(春之风):
       其实,你的方法我也想过,不过当时代码写错了。最后答案如下:
    1、SELECT * INTO temp1 FROM user0 WHERE id in (select min(id) from user0 group by fzx);
    2、drop table user0
    3、SELECT * INTO user0 FROM temp1;
    4、drop table temp1
    以上代码执行删除比原来的快了一半以上。
    强烈要求发帖的人要在结帖的时候公布最后代码。