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)
引入了新的关键词offset和fetch 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)
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
| 归档时间: |
|
| 查看次数: |
118646 次 |
| 最近记录: |