sybase 12.x 好像支持 select top n

解决方案 »

  1.   

    现在的情况是java这边不直接操作数据库,是通过c程序操作数据库,然后把数据转发给java的,所以只能通过sybase的底层功能.sybase的游标fetch一下就要把数据取出来而不能next到下一条记录,这样效率就很低了,有没有好的解决办法?
      

  2.   

    kingfish(八百里秦川@龙城异客) :
    你没理解我意思.这个是可以的,但是可能符合条件的有1000条,我要分100页来显示, 这样显示第100页的时候就只能top 1000,然后取第990-1000条,就是这个取的过程有点麻烦.
      

  3.   

    以为你是java直接连sybase, 至少11.x不支持select top那就是c那边问题了。记得unix下c里面可以
     while (sqlca.sqlcode == 0) {
        exec sql fetch 
     }
      

  4.   

    关键就是这个,exec sql fetch的时候,如果取990-1000条这10条数据的时候,前面990条没一条都要fetch出来,扔掉.能不能直接一直next到第990条,然后取10这样的办法?
      

  5.   

    缺了absolute(n)这样的东东我记得好像没有这类函数。如果数据不多,第一次时全部取过去,以后就在java端分页
      

  6.   

    SELECT TOP 页大小 *
    FROM TestTable
    WHERE (ID NOT IN
              (SELECT TOP 页大小*页数 id
             FROM 表
             ORDER BY id))
    ORDER BY ID
      

  7.   

    laughsmile(海边的星空):
    你这种方法对于只有一个主键的时候是起作用的,但是当有不只一个主键,而且排序条件中有非主键且在某个主键字段前面的话,就会有问题
      

  8.   

    你试试下面这个,在sqlserver下通过.
    CREATE Proc p_show
    @QueryStr nvarchar(1000), --查询语句,如果查询表,用:select * from 表
    @PageSize int=10, --每页的大小(行数)
    @PageCurrent int=1, --要显示的页
    @FdShow nvarchar (1000)='', --要显示的字段列表,如果查询结果有标识字段,需要指定此值,且不包含标识字段
    @FdOrder nvarchar (1000)='' --排序字段列表
    as
    declare @FdName nvarchar(50) --标识列名
    ,@Id1 varchar(20),@Id2 varchar(20) --开始和结束的记录号
    select @FdName='[ID_'+cast(newid() as varchar(40))+']'
    ,@Id1=cast(@PageSize*(@PageCurrent-1) as varchar(20))
    ,@Id2=cast(@PageSize*@PageCurrent-1 as varchar(20))
    ,@FdShow=case isnull(@FdShow,'') when '' then '*' else @FdShow end
    ,@FdOrder=case isnull(@FdOrder,'') when '' then '' else ' order by '+@FdOrder endexec('select '+@FdName+'=identity(int,0,1),'+@FdShow+'
    into #tb from('+@QueryStr+') a '+@FdOrder+'
    select '+@FdShow+' from #tb where '+@FdName+' between '
    +@Id1+' and '+@Id2
    )
    GO
      

  9.   

    有没有其他方法呢,因为类似的操作有很多,而且是分工到不同人的,这些sql语句过于复杂,我怕不一定能写出来,而且容易出错。