我有以下查询,效果很好。但我想用这个实现分页。
SELECT TOP x PostId FROM ( SELECT PostId, MAX (Datemade) as LastDate from dbForumEntry group by PostId ) SubQueryAlias order by LastDate desc
我想要什么
我有论坛帖子,以及相关条目。我想获取最新添加条目的帖子,所以我可以选择最近讨论过的帖子。
现在,我希望能够获得“前 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
(我宁愿将其标记为 hack - 但它已被使用,例如 NHibernate。使用明智的选择列作为 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 标准)。
offset
fetch next
但我想,你没有使用 SQL Server 2012 ,对吧?在以前的版本中,它有点(一点点)困难。这是所有 SQL Server 版本的比较和示例:这里
所以,这可以在 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