急!急!急!在Delphi中,如何用SQL实现只返回前N条记录,我已经被“骗”了50分!呜呜呜...(40分)

  • 主题发起人 主题发起人 李学先
  • 开始时间 开始时间

李学先

Unregistered / Unconfirmed
GUEST, unregistred user!
急!急!急!在Delphi中,如何用SQL实现只返回前N条记录,我已经被“骗”了50分!呜呜呜...
我想用SQL语句实现:在排序完成以后只返回前几条记录可是怎么都不行;
我想知道在Delphi中能否实现类似的功能,若不能,我发誓以后再也不用Delphi了......
我用下面语句:
with query1do
begin
sql.add('select top 2 name,deptno ,sum(subtotal)Total');
sql.add('from ot ');
sql.add('group by name,deptno ');
sql.add('order by Total');
prepare;
Open;

end;
其中的表:OT是PARADOX表。Name,Deptno,subtotal
上述语句我可以很肯定的告诉各位:肯定不行!但在Visual Basic中的却可以这么用!
我的运行环境是:Delphi5+ODBC98+SQL7.0
我已经在论坛上发过类似的帖子,并且cAkk已经回答过我说这样在Delphi中可以,
但我又试了一回,还是不行,不知怎么办?
我的分已经给了,可没有解决我的问题,我被"骗"了50分,我是个初学者,呜呜呜.....
希望哪位大蛱能救我.......
同时也希望cAkk能再给我回答一遍,我给你一次机会......
 
OT是PARADOX表
Delphi5+ODBC98+SQL7.0
到底是什么数据库。
看上去好象没错。你先把order by 去掉看看。
 
怎么没人理我啊
高手们快来啊,我顶不住了
 
对呀! 你到底用的是什么数据库? sql server 7.0肯定没问题的.
我一直这么用的.
下次我还你50分好了... :-(
 
谁让你没有满意就给分了
cAkk都气歪了
 
奇怪,没对就给分呀,只能怪自己了
 
其实也不是什么特别的数据库,只是一个简单的Paradox表!
也可以说是Paradox数据库吧,我是个freshman,不知说清了没有?
今天我问了一个搞软件的朋友,他说这个功能在Sql数据库中可以,
但在Paradox数据库中好像不行,
如果真不行的话,有不有别的方法?最好别是:
另建一个临时表,把取得的数据过滤到临时表.....
 
Paradox不是sql数据库,应该不支持的.
我当时说的是Delphi5+ODBC98+SQL7.0没问题.
 
首先,你要搞清楚想top哪一项,你现在这个语句,就算用SQL 7,
恐怕也就是把以z或汉字开头的人选出来而已.
其次,足够复杂的SQL语句可以实现或接近实现这个功能,
这是我用animals做的测试:
select * from animals where weight>(
select max(weight) from animals w2 where
(select count(*) from animals where weight <w2.weight)
<(select count(*)-2 from animals )) order by weight desc
其中weight是我所说的"你要top的"字段,而"2"是个数.
这条语句还有一点问题,即当具有相同值并且恰好是最大值
的记录超过两个时,选取的记录不存在,此时把第一个>改为
>=,可以选出所有最大值(超过2个).
如果谁有兴趣,还可以继续改造 :-)
 
抱歉,由于对top的意思理解有误,前面的第一条说的不太准确。
不过我给出的sql还是解决这种问题的一个方法,因为李学先
所作的程序是需要order by的,换句话说,排序后的记录的top n
与最大/最小的n条记录概念是等价的,因而可以用我的办法解决。
不过,如果需要排序的是计算字段,如李学先的例子那样,则sql
是否支持如此复杂的语法,还需要试验。
 
你的问题我有会,不过别太小家子气,50分不算什么,我刚来200分不知问了什么就发
出去了。唉,命苦呀!
 
非常感谢大家的参与,由于我上网非常不方便,直到今天我才看到大家的讨论,鉴于40MOD6<>0我只好不能均分了。
 
我想问一下“温柔一刀”:
可否详细解释一下:上面的SQL语句的意思
 
select * from animals where weight>(
select max(weight) from animals w2 where
(select count(*) from animals where weight 《 w2.weight)
《(select count(*)-n from animals )) order by weight desc
首先,我把这条sql再写一遍,因为小于号会被浏览器吃掉。
这条语句的作用是取得weight最大的n条记录。
那么,首先,如果某条记录的weight使得"小于它的weight的记录数
严格小于count(*)-n",那么它就不属于最大的n条记录。
^^^^^^^ ^^^^^^
而后,把这种记录中最大的一条取出来,(select max(...)),
则比这条记录weight严格大的记录,必然是属于"weight最大的n条记录"。
当然,唯一的问题就是当存在weight值相等的记录时,情况比较复杂,
一句话说不清楚。但这种情况下,即使是支持top的系统,没有其他条件
也不可能准确返回你所希望的记录。
有一点我想强调,SQL语句功能很强,你只要关系理论和SQL学的足够好,
能够一句话搞定非常复杂的查询。
 
上午我看到一个关于Paradox表《==》Excel工作簿的转换的贴子,现在找不着了,
谁知道快告诉我,
 
用paradox或excel检索一下
http://www.gislab.ecnu.edu.cn/delphibbs/DispQ.asp?LID=250371
 
埋怨不要太多了,大家都是好同志。
 
我还想问一下“温柔一刀”语句中的W2是什么意思,不要见笑,我是初学者,我用animals.dbf(DBDEMOS)试了,确实可以,但是还看不懂语句的意思。
希望“温柔一刀”不要嫌我烦。在此先谢了。
 
w2是SQL alias,在一个表作自连接的时候,或者类似本例子,
总之一个表名出现多次,要引用其字段时,必须指明使用那一次出现的表名,
因而必须用别名来标识。
 
W2是表animals的别名
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部