实现分页(跳过/取)功能与此查询(Implement paging (skip / take) fu

2019-06-18 20:11发布

我一直在试图了解有关如何实现自定义分页在SQL,比如读一点点像这样的文章 。

我有以下查询,它完美的作品。 不过,我想实现分页与这一个。

SELECT TOP x PostId FROM ( SELECT PostId, MAX (Datemade) as LastDate
 from dbForumEntry 
 group by PostId ) SubQueryAlias
 order by LastDate desc

这是什么我想

我有论坛的帖子以及相关的条目。 我想与最新添加的条目的职位,这样我就可以选择最近讨论的帖子。

现在,我希望能够获得“十佳至20日前主动站”,而不是“前10名”。

我有什么企图

我试图实现行用作一文中,但真的没有运气。

任何想法如何实现它?

Answer 1:

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

新关键词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


Answer 2:

为了在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



Answer 3:

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



Answer 4:

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

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



Answer 5:

您可以使用嵌套查询分页如下:寻呼从4行8列,其中客户ID是主键

选择顶层5 * FROM客户WHERE国家= '德国' 和客户编号不在(SELECT TOP 3的CustomerID客户WHERE国家= '德国' ORDER BY市)ORDER BY城市;



文章来源: Implement paging (skip / take) functionality with this query