小编典典

使用此查询实现分页(跳过/获取)功能

all

我有以下查询,效果很好。但我想用这个实现分页。

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 功能实现为文章中的功能,但真的没有运气。

任何想法如何实现它?


阅读 61

收藏
2022-08-19

共1个答案

小编典典

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

引入了新的关键字offsetfetch next(仅遵循 SQL 标准)。

但我想,你没有使用 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
2022-08-19