我一直在试图了解有关如何实现自定义分页在SQL,比如读一点点像这样的文章 。
我有以下查询,它完美的作品。 不过,我想实现分页与这一个。
SELECT TOP x PostId FROM ( SELECT PostId, MAX (Datemade) as LastDate
from dbForumEntry
group by PostId ) SubQueryAlias
order by LastDate desc
这是什么我想
我有论坛的帖子以及相关的条目。 我想与最新添加的条目的职位,这样我就可以选择最近讨论的帖子。
现在,我希望能够获得“十佳至20日前主动站”,而不是“前10名”。
我有什么企图
我试图实现行用作一文中,但真的没有运气。
任何想法如何实现它?
在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
(我宁愿标记,作为一个黑客-但它的使用,例如,通过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版本: 这里
因此,这可以在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
SQL 2008
拉迪姆·克勒的回答工作,但这里是一个较短的版本:
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
OFFSET 10 ROWS -- skip 10 rows
FETCH NEXT 10 ROWS ONLY; -- take 10 rows
在您选择语法的末尾使用此。 =)
您可以使用嵌套查询分页如下:寻呼从4行8列,其中客户ID是主键
选择顶层5 * FROM客户WHERE国家= '德国' 和客户编号不在(SELECT TOP 3的CustomerID客户WHERE国家= '德国' ORDER BY市)ORDER BY城市;