200分求教,怎样对一个表进行查询:得到附合条件的前100条,第2个100条,第3个100条...(200分)

  • 主题发起人 主题发起人 呆子12
  • 开始时间 开始时间

呆子12

Unregistered / Unconfirmed
GUEST, unregistred user!
怎样在一个很大的表进行查询:得到附合条件的前100条,
第2个100条,第3个100条...
就象大富翁网页中的查询一样。
它的SQL语句怎样写?(MS SQL SERVER 7.0)
 
我也想听听
 
select * TOP 100 from table_name
 
1、SQL中,“取出第几条纪录”的观念是不对的。
2、如果表有关键字段且是聚簇索引,可以把根据关键字段来看待“第几条纪录”的概念。
3、第 n(n>1) 个100条记录:
SELECT * TOP 100 FROM Table_Name
WHERE MasterField NOTo IN(SELECT MasterField TOP (n-1)*100 FROM Table_Name)
 
同意lccc,但只限于sqlserver7
 
如果该表设置了索引字段,就可以使用好像是rowid(和oracle中的rownum)一样,可以将
他作为条件来限制记录数,该字段是表明记录的位置的。具体察看一下sql的help就可以了。
 
感谢各位的参与!
SELECT * TOP 100 FROM Table_Name
只能返回符合条件的前100条,那么第二个100条怎么办?
另外,由于条件所限,这个表很大,且没有索引。
之所以提出这个问题,是因为:我们开发的系统中一个表中
的记录很多(千万条),如果查询时,不对返回的结果进行
限制,那么SERVER端送过来的数据量是相当大的,会造成资源
减少,甚至超出内存的限制使程序报错(我已经遇到这样的问题了)
如果查询只返回其中的几条,这样就会减少SERVER的开销,对CLIENT
端也有利。如果象大富翁网页的问题查询那样,先返回结果的第一页,
如果想看另几页,再对另几页进行查询就行了,
问题是:SQL SERVER 中的TOP 100 只能返回前100行,第二个100行
我还没有好办法,zqmagic 所说的rowid好象在SQLSERVER中是没有的。
lccc 说的可能是对的,但是我的系统中没有索引(所以也就没有条件试)。

呆子12
 
感谢各位的参与!
SELECT * TOP 100 FROM Table_Name
只能返回符合条件的前100条,那么第二个100条怎么办?
另外,由于条件所限,这个表很大,且没有索引。
之所以提出这个问题,是因为:我们开发的系统中一个表中
的记录很多(千万条),如果查询时,不对返回的结果进行
限制,那么SERVER端送过来的数据量是相当大的,会造成资源
减少,甚至超出内存的限制使程序报错(我已经遇到这样的问题了)
如果查询只返回其中的几条,这样就会减少SERVER的开销,对CLIENT
端也有利。如果象大富翁网页的问题查询那样,先返回结果的第一页,
如果想看另几页,再对另几页进行查询就行了,
问题是:SQL SERVER 中的TOP 100 只能返回前100行,第二个100行
我还没有好办法,zqmagic 所说的rowid好象在SQLSERVER中是没有的。
lccc 说的可能是对的,但是我的系统中没有索引(所以也就没有条件试)。

呆子12
 
感谢各位的参与!
SELECT * TOP 100 FROM Table_Name
只能返回符合条件的前100条,那么第二个100条怎么办?
另外,由于条件所限,这个表很大,且没有索引。
之所以提出这个问题,是因为:我们开发的系统中一个表中
的记录很多(千万条),如果查询时,不对返回的结果进行
限制,那么SERVER端送过来的数据量是相当大的,会造成资源
减少,甚至超出内存的限制使程序报错(我已经遇到这样的问题了)
如果查询只返回其中的几条,这样就会减少SERVER的开销,对CLIENT
端也有利。如果象大富翁网页的问题查询那样,先返回结果的第一页,
如果想看另几页,再对另几页进行查询就行了,
问题是:SQL SERVER 中的TOP 100 只能返回前100行,第二个100行
我还没有好办法,zqmagic 所说的rowid好象在SQLSERVER中是没有的。
lccc 说的可能是对的,但是我的系统中没有索引(所以也就没有条件试)。

呆子12
 
感谢各位的参与!
SELECT * TOP 100 FROM Table_Name
只能返回符合条件的前100条,那么第二个100条怎么办?
另外,由于条件所限,这个表很大,且没有索引。
之所以提出这个问题,是因为:我们开发的系统中一个表中
的记录很多(千万条),如果查询时,不对返回的结果进行
限制,那么SERVER端送过来的数据量是相当大的,会造成资源
减少,甚至超出内存的限制使程序报错(我已经遇到这样的问题了)
如果查询只返回其中的几条,这样就会减少SERVER的开销,对CLIENT
端也有利。如果象大富翁网页的问题查询那样,先返回结果的第一页,
如果想看另几页,再对另几页进行查询就行了,
问题是:SQL SERVER 中的TOP 100 只能返回前100行,第二个100行
我还没有好办法,zqmagic 所说的rowid好象在SQLSERVER中是没有的。
lccc 说的可能是对的,但是我的系统中没有索引(所以也就没有条件试)。

呆子12
 
NOTo in 是 not in 同意lccc
很大的表且没有索引 呵呵 奇怪的说法
但总有保持唯一的字段或字段的组合吧。如果有把MasterField换成那个字段就可以了
我觉得你还是要再分析一下表结构,没有索引的表一般是不合理的。
 
可以建一个临时表先返回一千条记录,再分别读第100条,200条可以么:)
 
另一个办法:(权宜之计)
建立一个procedure ,参数是你 要取的表记录起点和数目,
在procedure中把符合条件的select回来。
在client端select * from procedre;
(interbase 中没有select top 10 * from table 语法,
FAQ 中就是这样解决的,对sql server 应该一样。)
这样,服务器端工作变化量还是很大,不过幸好是procedure,
但与client通信量达到你的要求了。
 
为什么不建索引?
同意lccc
但好像是:SELECT TOP 100 * FROM Table_Name。。。。。。
 
就是反了
SELECT TOP 100 * FROM Table_Name
 
我觉得最简单的方法就是新建一个记录号的字段,这样的话。。。
前一百条:select * from table1 where recordno<=100;
第二个一百:select * from table1 where recordno between 100 and 200
.........................................
 
各位好!
再详细说一下,本系统是电话话单,这里是没有唯一索引的,
如果有索引的话,就会有另外一个问题:有索引的表插记录
是很慢的(表越大越显),一个大城市中,一天的通话记录
可以达到上千万条,这时,向表里插记录慢得让人受不了,
影响系统性能。
 
1、索引建的好的话,不会影响速度;
2、你的表必须有一个可以唯一区分记录的字段或字段组合,否则,
你将无法删除记录及修改记录的。不信你试一试,在一个SQL 表
中,如果有两条完全相同的记录,将无法使用Delete删除其中一
条,也无法使用Update更新其中一条。
3、你在表中增加一个自增字段,则该字段将具有聚簇索引的特征,
且不会重新索引而降低速度。
4、你没有唯一区分记录的办法,那么是如何确保同一条记录部被
插入两次?

 
很同意lccc!!
 
多人接受答案了。
 
后退
顶部