我一直在尝试了解如何在 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
(我宁愿将其标记为 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
引入了新的关键字 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 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
OFFSET 10 ROWS -- skip 10 rows
FETCH NEXT 10 ROWS ONLY; -- take 10 rows
在选择语法的末尾使用它。 =)
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
修复方法是使用 XML 编辑器修改您的 EDMX 文件,并将 ProviderManifestToken 的值从 2012 更改为 2008。我在 EDMX 文件的第 7 行发现了这一点。保存该更改后,将使用“旧”的 SQL Server 2008 兼容语法生成分页 SQL。
我很抱歉在这个非常古老的线程上发布答案。为像我这样的人发布它,我今天解决了这个问题。
您可以使用嵌套查询进行分页,如下所示:
从 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;
不定期副业成功案例分享
@Start
为 0 且@End
为 1000,WHERE 是否应为WHERE RowNumber >= @Start AND RowNumber < @End
以获取前 1000 行?WHERE RowNumber > @Start AND RowNumber <= @End