我用下面这个程序欲实现学生排名次的功能:(当总分相同时,名次一样,但是总数要累加)即
xsbh    总分 县名次
001   500  1
003   500  1
004   499  3
002   499  3
005   496  5
这个功能!
k:=0;
for i:=1 to adoquery4.RecordCount do
 begin
  adoquery4.RecNo:=i;
  if adoquery4.Fields[6].Value<>k then//如果下一条不等于上一条则用i
    begin
    l:=i;
    xsbh:=adoquery4.Fields[0].Value;
    adoquery5.Close;
    adoquery5.SQL.Clear;
    adoquery5.SQL.Add('update cy set 县名次= '+inttostr(i) +' where xsbh=:xsbh');
    ADOQUERY5.Parameters[0].Value:=xsbh;
    adoquery5.ExecSQL;
    k:=adoquery4.Fields[6].Value;
    end
    else//如果下一条等于上一条则计数器不累加
    begin
    xsbh:=adoquery4.Fields[0].Value;
    adoquery5.Close;
    adoquery5.SQL.Clear;
    adoquery5.SQL.Add('update cy set 县名次= '+inttostr(l)+' where xsbh=:xsbh');
    ADOQUERY5.Parameters[0].Value:=xsbh;
    adoquery5.ExecSQL;
    k:=adoquery4.Fields[6].Value;
    end;
  end;
以上程序能够实现,但是效率极低(5000条记录要花4分钟了,PIII866下调试)
不知这个程序怎么修改,使效率提高,最好能在几秒钟内解决!

解决方案 »

  1.   

    为什么不直接使用SQL语句,在里面执行存储过程
      

  2.   

    to zhangabo(阿波)
    这个我本来是在按总分排序后再填写的呀!
    to : ruoqi2003(青春网星) 
    我是在ado+access2000做的,你说的存储过程怎么做呀!
      

  3.   

    select * from cy order by 总分 A....(升序)
      

  4.   

    你先加上索引然后再:i:=0;
    k:=0;
    zf:=-1;
    adoquery4.sql.text :=select 总分,县名次 from cy order by 总分';
    adoquery4.open;
    while not adoquery4.eof do
      begin
        if zf<>adoquery4.fieldbyname('总分').asinteger then
          begin
            
            k:=k+1;
            adoquery4.edit;
            adoquery4.fieldbyname('县名次').asinteger:=k;
            adoquery4.post;
            i:=k;
            zf:=adoquery4.adoquery4.fieldbyname('总分').asinteger;
          end
       else
          begin
            k:=k+1;
            adoquery4.edit;
            adoquery4.fieldbyname('县名次').asinteger:=i;
            adoquery4.post;
            zf:=adoquery4.adoquery4.fieldbyname('总分').asinteger;
          end;
       adoquery4.next;
      end;
      

  5.   

    少写了一个单引号:你先加上索引然后再:i:=0;
    k:=0;
    zf:=-1;
    adoquery4.sql.text :='select 总分,县名次 from cy order by 总分';
    adoquery4.open;
    while not adoquery4.eof do
      begin
        if zf<>adoquery4.fieldbyname('总分').asinteger then
          begin
            
            k:=k+1;
            adoquery4.edit;
            adoquery4.fieldbyname('县名次').asinteger:=k;
            adoquery4.post;
            i:=k;
            zf:=adoquery4.adoquery4.fieldbyname('总分').asinteger;
          end
       else
          begin
            k:=k+1;
            adoquery4.edit;
            adoquery4.fieldbyname('县名次').asinteger:=i;
            adoquery4.post;
            zf:=adoquery4.adoquery4.fieldbyname('总分').asinteger;
          end;
       adoquery4.next;
      end;
      

  6.   

    先用SQL查出DISTINCT后的总分,并排序。然后根据这个顺序依次查出相应总分的学生,不知这样效率怎么样。
      

  7.   

    lastexile(last_exile)
    能不能具体一点呀?在线等你!
      

  8.   

    select xsbh,    总分,
     (select count(*)+1 from t as b where a.总分>b.总分 ) as 县名次
    from t as a
    order by 总分 descfor sql server.
      

  9.   

    to  cjg98821(hellow)
    你只是统计吧!对access用ado是比较慢的!你可以改用DiamondAccess控件连接!语句也不用改太多!
    在www.51delphi.com有下载!DiamondAccess是dao的!比ado块狠多啊!其实连接access有好多选择:
    DiamondAccess、kadao等.
    kadao:http://www.delphi.pari.bg/
      

  10.   

    大哥,你这个语句在ado+access2000中行吗?
    行的话怎么用?
      

  11.   

    是说我的语句吗?
    在ACCESS中是可用的。给你的语句直接放在ADOQuery中Open即可。
      

  12.   

    to windindance(风舞轻扬)
    我这样用要出错的么!
    adoquery5.Close;
    adoquery5.SQL.Clear;
    adoquery5.SQL.Add('select xsbh,总分,(select count(*)+1 from t as b where a.总分>b.总分 ) as 县名次 from t as a order by 总分 desc');
    adoquery5.ExecSQL;
      

  13.   

    to windindance(风舞轻扬)
    你里面的a,b,t是什么意思?能不能将这个查询的中文意思讲一下?
    出错提示如下:
    "microsoft jet数据库引擎找来到找不到输入表或查询't'。确定它是否存在,以及它的名称的拼写是否正确"
      

  14.   

    to masterjames(james):
    你的意思是不是将数据库改为sql server?
    最好不用sql server,学校里都是win98的系统呀!
    能不能用access2000呀?
      

  15.   

    唉,你就一点都不会修改啊?
    里面的a,b是表的别名,可以不用管他。
    t是表的名称,改为你实际的表名。
      

  16.   

    adoquery5.Close;
    adoquery5.SQL.Clear;
    adoquery5.SQL.Add('select xsbh,总分,(select count(*)+1 from cy as b where a.总分>b.总分 ) as 县名次 from cy as a order by 总分 desc');
    adoquery5.Open;