使用此查询实现分页(跳过/带出)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
新的关键字offset
和fetch 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