我有一个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 总分=语文+数学+英语,它不管在哪里都能通过?
编号 总分 名次
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 总分=语文+数学+英语,它不管在哪里都能通过?
解决方案 »
- 请教一段程序
- 如何判断是TCP包还是UDP包
- 奇怪了adoquery post方法批量导入jpeg图片(文件)到access ole字段 发现有的图片没有保存上难道post大文件需要时间? 代码如下:
- 各位,delphi如何调用jsp网页呀?在线等回复,正确回复就大散分
- 关于把文件存入数据库(自己的软件)
- 应用服务器死机
- 把imagelist控件的图片属性改成32*32后,toolbar上的图标就不能显示了?
- 升级为五星,热烈祝贺,散分!
- 如何取得某个表中的某个字段的字段类型?
- delphi!!!
- 急,怎樣解決這個的報表,解決馬上給分
- ClipCursor锁定鼠标范围与解除鼠标锁定范围的问题 200410
能有最好的兼容性:)http://lysoft.7u7.net
然后while not eof do
逐个赋值,应该不会慢的http://lysoft.7u7.net
真是这样的吗?那我完了,全面的全白费了吗?
不会吧!是不是有点不一样?
:)
还是我的方法好:SQL排序,剩下的逐个递增赋值,都非常的简单http://lysoft.7u7.net
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;
全用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
adodataset.commandtext:='select 名次 from cy order by 名次' 先用SQL排序http://lysoft.7u7.net
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;
注意处理过程中ADODataSet不要使用界面,就是不要有DBEdit,DBGrid之类的显示组件
用了DB的UI会严重降低处理速度的
应该不会慢的Edit Post是很普通的方法,SQL的实现机制都是基本的编辑提交http://lysoft.7u7.net
5K记录很少的,不用数据库,所有数据用Record类型在RAM中处理都非常的快把你的MDB数库同我写给你的代码上传到ftp://upload:[email protected]我给你看看了http://lysoft.7u7.net
推荐用SQL语法做。数据库优化了的。
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;
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