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

Lar*_*ard 118 sql sql-server pagination join

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

我有以下查询,它完美地工作.但我想用这个实现分页.

SELECT TOP x PostId FROM ( SELECT PostId, MAX (Datemade) as LastDate
 from dbForumEntry 
 group by PostId ) SubQueryAlias
 order by LastDate desc
Run Code Online (Sandbox Code Playgroud)

我想要的是什么

我有论坛帖子,有相关条目.我想获得最新添加的条目的帖子,所以我可以选择最近辩论的帖子.

现在,我希望能够获得"最近10到20个活跃的帖子",而不是"前10名".

我试过了什么

我试图将ROW函数实现为文章中的那个,但实际上没有运气.

有什么想法如何实现呢?

Rad*_*ler 259

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
Run Code Online (Sandbox Code Playgroud)

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

SELECT col1, col2, ...
  ...
 ORDER BY CURRENT_TIMESTAMP
OFFSET     10 ROWS       -- skip 10 rows
FETCH NEXT 10 ROWS ONLY; -- take 10 rows
Run Code Online (Sandbox Code Playgroud)

(我宁愿将其标记为黑客 - 但它已被使用,例如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
Run Code Online (Sandbox Code Playgroud)

引入了新的关键词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
Run Code Online (Sandbox Code Playgroud)

  • 如果我理解你的话,你想按LastDate排序,对吗?然后我们可以这样改变OVER()子句:ROW_NUMBER()OVER(ORDER BY**MAX(Datemade)desc**).*并删除最后一个ORDER BY PostId*.现在应根据需要"更快"地对CTE进行分类.正确? (2认同)

Tad*_*dej 8

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
Run Code Online (Sandbox Code Playgroud)

来源:https : //forums.asp.net/post/4033909.aspx


小智 7

OFFSET     10 ROWS       -- skip 10 rows
FETCH NEXT 10 ROWS ONLY; -- take 10 rows
Run Code Online (Sandbox Code Playgroud)

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


小智 6

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

例:

select * from table order by [some_column] 
offset 10 rows
FETCH NEXT 10 rows only
Run Code Online (Sandbox Code Playgroud)

在执行此操作时,您无法使用"TOP"关键字.

您可以在此处了解更多信息:https: //technet.microsoft.com/pt-br/library/gg699618%28v=sql.110%29.aspx