数据表结构如下:字段Id  字段1  字段2 字段3通常我们会用一个自增长的Id来进行排序,方法:取出要翻到的页码的前一页的最大或最小id,然后大于或小于这个Id再Top一下就可以。
但我的问题是:先要按别的字段排序如 order by 字段1  desc, 字段12 desc.这时候字段Id 已经打乱了没有作用。我怎么能取出应该翻页取的数据?(也就是要取10-20条数据不能取1-20条)。大家发表意见,顶者有分!

解决方案 »

  1.   

    在绑定到datagrid的时候,生成一个序号。
      

  2.   

    可以试试:
    select Top 10 from 表 where id not in (select id from 表 order by  字段1  desc, 字段12 desc) order by  字段1  desc, 字段12 desc
    应该可以,效率可能会差一些,不过数据量不大时应该没问题。
      

  3.   

    使用假分页,先把数据取到DataSet里,然后一次从DataSet里取你要的!
    但是效率会比你那种真分页的低点点!
      

  4.   

    bitliuyang(昊天) :你的not in 是什么意思?
    hui1202(骨灰):你说具体一点,第二次怎么从dataset里面取了?
      

  5.   

    reate PROCEDURE GetRecordFromPage
        @tblName      varchar(255),       -- 表名
        @fldName      varchar(255),       -- 字段名
        @PageSize     int = 10,           -- 页尺寸
        @PageIndex    int = 1,            -- 页码
        @Iscount      bit = 0,            -- 返回记录总数, 非 0 值则返回
        @OrderType    bit = 0,            -- 设置排序类型, 非 0 值则降序
        @strwhere     varchar(1000) = ''  -- 查询条件 (注意: 不要加 where)
    ASdeclare @strSQL   varchar(6000)       -- 主语句
    declare @strTmp   varchar(100)        -- 临时变量
    declare @strOrder varchar(400)        -- 排序类型if @OrderType != 0
    begin
        set @strTmp = "<(select min"
        set @strOrder = " order by [" + @fldName +"] desc"
    end
    else
    begin
        set @strTmp = ">(select max"
        set @strOrder = " order by [" + @fldName +"] asc"
    endset @strSQL = "select top " + str(@PageSize) + " * from ["
        + @tblName + "] where [" + @fldName + "]" + @strTmp + "(["
        + @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["
        + @fldName + "] from [" + @tblName + "]" + @strOrder + ") as tblTmp)"
        + @strOrderif @strwhere != ''
        set @strSQL = "select top " + str(@PageSize) + " * from ["
            + @tblName + "] where [" + @fldName + "]" + @strTmp + "(["
            + @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["
            + @fldName + "] from [" + @tblName + "] where " + @strwhere + " "
            + @strOrder + ") as tblTmp) and " + @strwhere + " " + @strOrderif @PageIndex = 1
    begin
        set @strTmp = ""
        if @strwhere != ''
            set @strTmp = " where " + @strwhere    set @strSQL = "select top " + str(@PageSize) + " * from ["
            + @tblName + "]" + @strTmp + " " + @strOrder
    endif @Iscount != 0
        set @strSQL = "select count(*) as Total from [" + @tblName + "]"exec (@strSQL)
    GO
    这个存储过程可以实现分页,但不清楚是不是你想要的功能(只能实现单字段排续)
      

  6.   

    declare @indextable table(id int identity(1,1),nid int)
                 declare @PageLowerBound int
                 declare @PageUpperBound int
                 set @PageLowerBound=(@pageindex-1)*@pagesize
                 set @PageUpperBound=@PageLowerBound+@pagesize
                 set rowcount @PageUpperBound
                 insert into @indextable(nid) select id from news order by addtime desc
                 select O.id,O.source,O.title,O.addtime from news O,@indextable t where O.id=t.nid
                 and t.id>@PageLowerBound and t.id<=@PageUpperBound order by t.id
                 end
    看看这个
      

  7.   

    有人说SQL分页“快”。如果每一次对大量记录分页之前都要重新生成整个数据库临时数据,这还能“快”吗?
      

  8.   

    select top 10 * from table1 where id not in(select top 10 id from table1 order by 字段1 desc,字段2 desc) order by 字段1 desc,字段2 desc