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

标签 sql sql-server join pagination

我一直在尝试了解一些有关如何在 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

引入了新关键字offsetfetch 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/

相关文章:

sql - 消息 102,级别 15,状态 1,第 6 行 'Reference' 附近的语法不正确

mysql - 根据字段值更改mysql表连接

sql - UNION 与 WHERE 子句

sql - 将 XML 节点插入表中的 SQL 列

PHP 查询 - 帮助将两个查询链接到 1 个 echo 语句

mysql - 从连接表形成的行中返回字段的最低值

sql - SQL Joining 3个表标记系统代码点火器

sql - 创建2个具有相同键列但包含不同列的非聚集索引

c# - 无效的列名sql错误

mysql - 计算列上的内连接