我有一个access2000的数据库cjgl.mdb,其中里面有一个表cy,记录如下:
编号  总分 名次
001   580  
004     580   
002     578    
003     578    
005     578    
006     560
下面我想对它进行排序更新为
编号  总分 名次
001   580  1
004     580    1
002     578    3
003     578    3
005     578    3
006     560    6
我的程序如下:
adoquery5.Close;
ADOQuery5.SQL.Clear;
ADOQuery5.SQL.Text:='Update cy Set 名次=(Select Count(*)+1 From cy as a  Where a.总分>b.总分 ) From cy as b';
ADOQuery5.ExecSQL;
调试时,系统说“语法错误(操作符丢失)在查询表达式"(Select Count(*)+1 From cy as a  Where a.总分>b.总分 ) From cy as b"中。
这是为什么?
另:
我把这个cy表导入到sqlserver中,然后再在SQL查询分析器输入上面的SQL语句(Update cy Set 名次=(Select Count(*)+1 From cy as a  Where a.总分>b.总分 ) From cy as b),没有任何错误!
所以我想在SQLServer中能调试通过的语句拿到ACCESS2000作查询是不是不行的?
那为什么有的是行的如update cy set 总分=语文+数学+英语,它不管在哪里都能通过?

解决方案 »

  1.   

    呵呵,如果是我,我就用基本的排序算法实现,不需要用SQL的
    能有最好的兼容性:)http://lysoft.7u7.net
      

  2.   

    access 不支持部分SQL语法的!!
      

  3.   

    我也试过你的想法,不过6000多人,用基本得法耗时在4分钟了(Piii866 win2000),有点受不了呀!
      

  4.   

    是用ADODataSet.CommandText的SQL用基本的Order By方法
    然后while not eof do
    逐个赋值,应该不会慢的http://lysoft.7u7.net
      

  5.   

    to aiirii(ari-爱的眼睛)
    真是这样的吗?那我完了,全面的全白费了吗?
    不会吧!是不是有点不一样?
      

  6.   

    Access的SQL同SQL Server的SQL有部分是不兼容的
    :)
    还是我的方法好:SQL排序,剩下的逐个递增赋值,都非常的简单http://lysoft.7u7.net
      

  7.   

    这个5000条记录的循环要4分钟了
    for i:=1 to h  do
     begin
      adoquery4.RecNo:=i;
      if adoquery4.Fields[g].Value<>k then
        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[adoquery4.Fields.Count-4].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[adoquery4.Fields.Count-4].Value;
        end;
      end;
      

  8.   

    ADOQUERY5.Parameters[0].Value:=xsbh;是多余的
      

  9.   

    完全不是哪样的事情!
    全用SQL效率差的
    我给的是方法,自己处理了:)adodataset.commandtext:='select 名次 from cy' 先用SQL排序
    adodataset.active:=true
    adodataset.first;
    i:=1;
    while not adodataset.eof do 逐个处理
    begin
    edit;编辑
    field[0].asinteger:=i;
    post;提交
    inc(i);
    next;下一个
    end;http://lysoft.7u7.net
      

  10.   

    搞错,是
    adodataset.commandtext:='select 名次 from cy order by 名次' 先用SQL排序http://lysoft.7u7.net
      

  11.   

    不能!但可以用技巧的,自己不会考虑吗??保存上一个结果,比较,这时候Select要包括分数同名次了:)没有做不到的,只是你没去思考http://lysoft.7u7.net
      

  12.   

    你可能自己还没有试过吧!
    5000条记录,我打了两副牌还没有好
    procedure Tfrmpm.Button2Click(Sender: TObject);
    var i:integer;
    begin
    adodataset1.commandtext:='select * from cy order by tota desc';//先用SQL排序
    adodataset1.active:=true;
    adodataset1.first;
    i:=1;
    while not adodataset1.eof do //逐个处理
    begin
    adodataset1.edit;//编辑
    adodataset1.fields[8].asinteger:=i;
    adodataset1.post;//提交
    inc(i);
    adodataset1.next;//下一个
    end;
    end;
      

  13.   

    呵呵
    注意处理过程中ADODataSet不要使用界面,就是不要有DBEdit,DBGrid之类的显示组件
    用了DB的UI会严重降低处理速度的
    应该不会慢的Edit Post是很普通的方法,SQL的实现机制都是基本的编辑提交http://lysoft.7u7.net
      

  14.   

    Access里能用SQL语句的,只不过ACCESS的语法有一部分和标准的SQL语句不一样
      

  15.   

    我觉得没理由的
    5K记录很少的,不用数据库,所有数据用Record类型在RAM中处理都非常的快把你的MDB数库同我写给你的代码上传到ftp://upload:[email protected]我给你看看了http://lysoft.7u7.net
      

  16.   

    把一个SQL语句拆分一下,比如看看Select Count(*)+1 From cy as a  Where a.总分>b.总分 ) From cy as b'看看能否通过。然后再加一个更新的Query。应该可以的。
    推荐用SQL语法做。数据库优化了的。
      

  17.   

    呀,居然有人记得我。惊讶ing
    1 nod楼上,access支持的sql查询能力比sql server是少很多
    2 由于你循环中的sql语句每一次的update和post都造成了一次完整的交互,会在数据库中重复频繁的+ -锁等,会影响速度。
    规则(个人建议):尽量不要在client段执行循环以及大量连续的短事务。
    建议用一个数据库的view,或者在数据库端用一条select语句将排序导入一个临时表中。
    (所以这里我不太赞同 ly_liuyang(Liu Yang)的方法,除非万不得已,并使用batchupdate以及严格的事务操作 )3 下面的query应该是你要的效果,如何改成update就自己弄弄吧
    SELECT a.编号, a.总分, (select  count(*) from cy )-Count(*)+1 AS 名次
    FROM cy AS a, cy AS b
    WHERE (((a.总分)>=[b].[总分]))
    GROUP BY a.编号, a.F2
    ORDER BY (select  count(*) from cy )-Count(*)+1;
      

  18.   

    关于access和sql server的区别,就太长了,建议看online help
      

  19.   

    乱谈:Selct 然后放到数组里面,然后循环数组赋值,然后update
      

  20.   

    在 firetoucher(风焱) 的基础上添加一点将数据导入一个新表中,在sqlserver2000中可以,在ACCESS中就不知道了
    select * into newtable from (
    SELECT top 100 percent a.编号, a.总分, 
    (select  count(*) from cy )-Count(*)+1 AS 名次
      FROM cy AS a, cy AS b
      WHERE (((a.总分)>=[b].[总分]))
    GROUP BY a.编号, a.总分
    ORDER BY (select  count(*) from cy )-Count(*)+1) a