我一直在尝试了解一些有关如何在 SQL 中实现自定义分页的知识,例如阅读 articles like this one .
我有以下查询,效果很好。但我想用这个来实现分页。
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
(我宁愿将其标记为黑客 - 但它已被使用,例如 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标准)。
但我猜您没有使用 SQL Server 2012,对吗?在以前的版本中,这有点困难。以下是所有 SQL Server 版本的比较和示例:here
所以,这可以在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 - 使用此查询实现分页(跳过/获取)功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13220743/