关于分段取数据的问题,如下:
字段:FID    FName       按FName排序:FID    FName
      1      B                        2      A
      2      A                        6      A
      3      B                        9      A
      4      C                        10     A
      5      B                        1      B
      6      A                        3      B
      7      B                        5      B
      8      C                        7      B
      9      A                        4      C
      10     A                        8      C
分段取数据,每次3条记录:
第一次:
FID    FName
2      A
6      A
9      A
第二次:
10     A
1      B
3      B
第三次:
5      B
7      B
4      C
第四次:
8      C
请问各位如何实现?

解决方案 »

  1.   

    就像SQL Explorer中那样,返回大记录集都是采取分段的方法,不知是如何实现的?
      

  2.   

    select top 3 * from table
      

  3.   

    to zhang21cnboy:
    如何设置数据集的属性?
    to firetoucher(风焱) :
    select top 3 * from table,没有解决排序的问题,更不能解决分段的问题。
      

  4.   

    1 用数据集select * from table order by FNAME
    2 分段的问题你可以直接设置delphi中数据集的属性就可以了
      

  5.   

    to firetoucher(风焱) :
    非常感谢你回答我的问题。请问如何设置数据集的属性?
      

  6.   

    State := dsBlockRead;

    property BlockReadSize: Integer;
      

  7.   

    第一次:
    ads.CommandText := ' select top 3 * from table order by FName'
    第二次?
    第三次?
    to firetoucher(风焱) :
    非常感谢你再次回答我的问题。但是ads.BlockReadSize := 3只能执行在ads.Open之后,并没有提高查询速度,也没有实现第二次,三次是否我的用法有误?
    ads.CommandText := ' select * from table order by FName';
    ads.Open;
    ads..BlockReadSize := 3;
    结果一次查出了所有记录,并没有出现设想的效果。
      

  8.   

    clientdataset有两个重要属性:packetrecords和fetchondemand!注意这两个就可以了
      

  9.   

    先看看我的做法:
    第一次
    select * from
    (select * from Table order by FName)
    where rownum<=3
    minus
    select * from
    (select * from Table order by FName)
    where rownum<=0
    第二次
    select * from
    (select * from Table order by FName)
    where rownum<=6
    minus
    select * from
    (select * from Table order by FName)
    where rownum<=3
    依此类推
      

  10.   

    我用于com+环境下,无状态,packetrecords和fetchondemand没有用处。
      

  11.   

    用clientdataset,设置PacketRecords为100
    如果再取下一个100的话可以用:
    ClientDataSet1.GetNextPacket;
      

  12.   

    sorry,没看到你的回复,
    1 如果你是取所有的数据而只是显示一部分,你可以用循环和book
    2 如果你只是分开取得话,假定为第n次,可以用sql
    select top 3 from (select top 3n * from table order by FName) order by FName disc
      

  13.   

    With ClientDataSet1 do
    begin
      FetchOnDemand:=False;//如果不对的话,就改为True;
      PacketRecords:=3;
    end;
    每次提取下一段数据时,调用ClientDataSet1.GetNextPacket;
      

  14.   

    to RobinHZ(熊掌) :嘿嘿,模拟Miads啊,数据库服务器吃不消啊。
      

  15.   

    我是加一个自增字段a
    SELECT TOP 3 *
    FROM table
    WHERE a >(SELECT  MAX(a)
                     FROM table where a in 
    (select top 
    6 a from table))
    不知数据大的时候会不会很慢。
      

  16.   

    to Apple:
    当n(3,6....360000)足够大的时候就很慢了。
      

  17.   

    sorry,原来是ORACLE,不支持TOP吧:)
    MIDAS是怎么搞定的,临时表么?
    李维不是说一次最好1000条么,是不是n会小些,数据再多是不是可以分表存放,比如2000年6月的数据建个表名叫Year2000_6之类。
      

  18.   

    就像delphi的SQL Explorer一样,当执行 select * from table1的时候,如果Table1有数十万条记录,一次只会取回几十条记录,当滚动条下移时,再取下几十条记录,直到取完所有记录。有谁知道是如何实现的么?
      

  19.   

    一、在李维的分布式书中讲了一个例子,就是在无状态的时候怎么分段取数据,由客户端数据集向服务器提供OwnerData数据,服务器数据集自己根据这个键值查找数据再回给客户端,这样试过吗?
    二、我觉得应该加一个自增字段,以FNAME排序的,这样你就可以写成(例自增字段是idd))
       select @idd = min(idd) from table 
       while @idd <> null
         begin
          select top 3 * 
          from table
          where  idd >= @idd
          select @idd = min(idd) from table where idd > @idd + 3
         end
      

  20.   

    你就让他按天取,要么按小时取,他想取的多,你告诉他会慢:)
    upup
      

  21.   

    第一次
    select * from
    (select * from Table order by FName)
    where rownum<=3
    第二次
    select * from
    (select * from Table order by FName)
    where rownum<=6
    minus
    select * from
    (select * from Table order by FName)
    where rownum<=3
    第三次
    select * from
    (select * from Table order by FName)
    where rownum<=9
    minus
    select * from
    (select * from Table order by FName)
    where rownum<=6
      

  22.   

    我原来就用的是Minus的方法,理论上是正确的,但实际上当n(3,6,9)够大时,就奇慢无比了。
      

  23.   

    A方案:
    存储过程和函数一样,你一个传参数进去呀
    根据参数动态查询SELECT IDENTITY(int, 1,1) as ID_num,*//如果yourtablename有一个自增字段,你就不能选这个字段
    into #temp
    FROM  yourtablename
    select * from #temp  where id_num>@p1 and id_num<@p2//
    B方案:
    1.select top 10000 * from goods  where ip not in (select top 10000 ip from goods)