168

我一直在尝试了解如何在 SQL 中实现自定义分页,例如阅读这样的文章

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

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

任何想法如何实现它?

4

6 回答 6

348

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
于 2012-11-04T18:35:21.190 回答
12

为了在 SQL Server 中执行此操作,您必须按列对查询进行排序,以便您可以指定所需的行。

例子:

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

于 2016-09-19T14:11:36.043 回答
11

SQL 2008

Radim Kö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

于 2017-06-21T11:21:32.347 回答
10
OFFSET     10 ROWS       -- skip 10 rows
FETCH NEXT 10 ROWS ONLY; -- take 10 rows

在选择语法的末尾使用它。=)

于 2017-05-03T17:57:03.983 回答
0

修复方法是使用 XML 编辑器修改您的 EDMX 文件,并将ProviderManifestToken的值从2012更改为2008。我在我的 EDMX 文件的第 7 行发现了这一点。保存该更改后,将使用“旧”的 SQL Server 2008 兼容语法生成分页 SQL。

我很抱歉在这个非常古老的线程上发布答案。为像我这样的人发布它,我今天解决了这个问题。

于 2020-09-21T22:43:55.420 回答
-1

您可以使用嵌套查询进行分页,如下所示:

从 4 Row 到 8 Row 分页,其中CustomerId主键

SELECT Top 5 * FROM Customers
WHERE Country='Germany' AND CustomerId Not in (SELECT Top 3 CustomerID FROM Customers
WHERE Country='Germany' order by city) 
order by city;
于 2018-02-22T11:55:54.517 回答