假设有一个留言本里面有n条留言这个留言本就是数据库中的一张表表名: message
字段: id  name content time如果我想按时间顺序查找最后回复的 第1到第10条 留言,
sql语句是:  select top 10 name,content from message order by time desc那么请问我如果想查找 第11条到第20条留言 的sql语句要怎么写呢?再进一步,我查找到 第i条到第j条 的sql语句要怎么写?( 0 < i < j <= n )其实我的意思就是说,我用select语句按某种顺序从一个表中查询出的结果,要如何获得结果中的第i条记录到第j条记录?前提是不能把数据全部读出来再去循环去查找,那样效率太低。非常感谢高手相助!!!

解决方案 »

  1.   

    select top (j-i+1) a.* from message a left join 
    (select top (i-1) id from message order by time desc) b
    on a.id=b.id
    where b.id is null
    order by a.time desc
      

  2.   

    楼上的大哥,非常感谢你回复我的帖子。你写的这个Sql语句我还不是怎么明白。 select top (j-i+1) a.* from message a left join (select top (i-1) id from message order by time desc) b on a.id=b.id where b.id is null order by a.time desc 请问在这里面 a 和 b 分别是什么东西啊? 还有你能把这整个这句解释一下吗?很感谢你! 
      

  3.   

    a -> 是message的别名
    b -> 是结果集(select top (i-1) id from message order by time desc)的别名a left join b -> 左联接b只有(i-1)个记录,所以从第i行开始,b.id is nullselect top (j-i+1) a.* ... where b.id is null
    即为取从message第i行到第j行的记录
      

  4.   

    其实利用分页查询就可以实现楼主想要的结果。Create Procedure SelectPage @TableName nvarchar(64), @KeyField nvarchar(64), @Fields nvarchar(512), @PageIndex int, @PageSize int = 15
    As
    Declare @sql nvarchar(512)
      if @PageIndex = 1  begin
        Set @sql = 'Select top ' + convert(nvarchar(8),@PageSize) + ' ' + @Fields + ' From ' + @TableName
      end
      else begin
        Set @sql = 'select top ' + convert(nvarchar(8),@PageSize) + ' ' + @Fields + ' From ' +  @TableName
        Set @sql = @sql + ' Where ' + @KeyField + ' > (select max(' + @KeyField + ') From (Select Top '
        Set @sql = @sql + convert(nvarchar(8), @PageSize * (@PageIndex - 1)) + ' * from '+ @TableName + ' Order by '+ @KeyField +') T)'
      end  --Print @sql
      exec sp_executesql @sql参数说明:@TableName:要查询的数据表名称@KeyField:数据表主键字段@Fields:要查询的字段名列表,使用逗号分隔,最后一个字段名后不需要逗号@PageIndex:要查询的页面索引@PageSize:每页数据笔数,默认为15,即每页15笔数据例:获取第11笔到第20笔记录
    Exec SelectPage 'Message', 'ID', 'name, content', 10, 2