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

我一直试图了解一点关于如何在 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 函数作为本文中的函数实现,但实际上没有成功。

有什么实施方案吗?

207020 次浏览

SQLServer2012中是非常非常容易的

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

如果我们想跳过 ORDERBY,我们可以使用

SELECT col1, col2, ...
...
ORDER BY CURRENT_TIMESTAMP
OFFSET     10 ROWS       -- skip 10 rows
FETCH NEXT 10 ROWS ONLY; -- take 10 rows

(我更愿意将其标记为黑客攻击——但它被使用了,例如 NHibernate。使用明智选择的列作为 ORDERBY 是首选方法)

来回答这个问题:

--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 标准)。

但我猜,你没有使用 SQLServer2012,对吗?在以前的版本中,它有一点(一点)困难。下面是所有 SQL 服务器版本的比较和示例: < a href = “ http://www.mssqltips.com/sqlservertip/2696/

因此,这可以在 SQLServer2008中工作:

-- 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

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

例如:

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

OFFSET     10 ROWS       -- skip 10 rows
FETCH NEXT 10 ROWS ONLY; -- take 10 rows

在 select 语法的末尾使用这个。 =)

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

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

从第4行分页到第8行,其中 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;

修正方法是使用 XML 编辑器修改 EDMX 文件,并将 提供者清单令牌的值从 二零一二年更改为 二零零八年。我在 EDMX 文件的第7行找到的。保存该更改后,将使用“ old”、 SQLServer2008兼容语法生成分页 SQL。

我很抱歉在这个很老的帖子上发布了一个答案。为像我这样的人发布,我今天解决了这个问题。