使用此查询实现分页(跳过/带出)function

我一直在尝试了解如何在SQL中实现自定义分页,例如阅读这样的文章 。

我有以下查询,完美的作品。 但是我想用这个来实现分页。

SELECT TOP x PostId FROM ( SELECT PostId, MAX (Datemade) as LastDate from dbForumEntry group by PostId ) SubQueryAlias order by LastDate desc 

我想要什么

我有论坛post,有相关的条目。 我想获得最新添加的post,所以我可以select最近辩论的职位。

现在,我希望能够获得“前10到20个最近活跃的职位”,而不是“前10名”。

我试过了什么

我试图在文章中实现ROW函数,但真的没有运气。

任何想法如何实施?

SQL Server 2012中,这非常简单

 SELECT col1, col2, ... FROM ... WHERE ... ORDER BY -- this is a MUST there must be ORDER BY statement -- the paging comes here OFFSET 10 ROWS -- skip 10 rows FETCH NEXT 10 ROWS ONLY; -- take 10 rows 

如果我们想跳过ORDER BY,我们可以使用

 SELECT col1, col2, ... ... ORDER BY CURRENT_TIMESTAMP OFFSET 10 ROWS -- skip 10 rows FETCH NEXT 10 ROWS ONLY; -- take 10 rows 

(我宁愿将它标记为黑客 – 但是,例如通过NHibernate使用它,要使用明智的select列作为ORDER BY是首选方式)

回答这个问题:

 --SQL SERVER 2012 SELECT PostId FROM ( SELECT PostId, MAX (Datemade) as LastDate from dbForumEntry group by PostId ) SubQueryAlias order by LastDate desc OFFSET 10 ROWS -- skip 10 rows FETCH NEXT 10 ROWS ONLY; -- take 10 rows 

新的关键字offsetfetch next (只是下面的SQL标准)被引入。

但我想,你不使用SQL Server 2012 ,对不对 ? 在以前的版本中,有点(有点)困难。 以下是所有SQL服务器版本的比较和示例: 这里

所以,这可以在SQL Server 2008中工作

 -- SQL SERVER 2008 DECLARE @Start INT DECLARE @End INT SELECT @Start = 10,@End = 20; ;WITH PostCTE AS ( SELECT PostId, MAX (Datemade) as LastDate ,ROW_NUMBER() OVER (ORDER BY PostId) AS RowNumber from dbForumEntry group by PostId ) SELECT PostId, LastDate FROM PostCTE WHERE RowNumber > @Start AND RowNumber <= @End ORDER BY PostId 

为了在SQL Server中执行此操作,您必须按列sorting查询,以便您可以指定所需的行。

例:

 select * from table order by [some_column] offset 10 rows FETCH NEXT 10 rows only 

当你这样做的时候你不能使用“TOP”关键字。

你可以在这里了解更多: https : //technet.microsoft.com/pt-br/library/gg699618%28v=sql.110%29.aspx

 OFFSET 10 ROWS -- skip 10 rows FETCH NEXT 10 ROWS ONLY; -- take 10 rows 

在你select的语法结尾使用这个。 =)

SQL 2008

RadimKöhler的答案是有效的,但是这是一个较短的版本:

 select top 20 * from ( select *, ROW_NUMBER() OVER (ORDER BY columnid) AS ROW_NUM from tablename ) x where ROW_NUM>10 

来源: https : //forums.asp.net/post/4033909.aspx