2012-11-04 64 views
72

我一直在嘗試瞭解如何在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名」。

有什麼我試圖

我試圖實現行用作一文中,但真的沒有運氣。

任何想法如何實現它?

回答

161

SQL Server 2012中如果我們想跳過ORDER BY我們可以使用

SELECT col1, col2, ... 
    ... 
ORDER BY CURRENT_TIMESTAMP 
OFFSET  10 ROWS  -- skip 10 rows 
FETCH NEXT 10 ROWS ONLY; -- take 10 rows 

(我寧願將其標記是非常非常容易

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 

,作爲一個黑客 - 但它的使用,例如通過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 
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 
+0

非常感謝!這真是一個很好的答案! 只有關於sql 2008的問題。我希望ORDER BY在WHERE之前發生,因爲它現在將對子集進行排序,但我們希望從整個集合中選擇一些...任何想法? :) 再次,謝謝 –

+2

如果我確實瞭解你,你想按LastDate排序,對不對?那麼我們可以這樣改變OVER()子句:ROW_NUMBER()OVER(ORDER BY ** MAX(Datemade)desc **)。 *並刪除最後的ORDER BY PostId *。現在CTE應該根據需要「儘快」排序。正確? –

+1

謝謝你的幫助,關於2012樣本的一個註釋,order by是強制性的,我正在嘗試這個沒有order by子句並且得到了錯誤「不正確的語法」,不知道什麼是錯誤的,直到我查看MSDN語法並且通過is強制性的。 – Esen

4

爲了在SQL Server中要做到這一點,你必須爲了通過查詢:here

所以,這可能在SQL Server 2008中工作一列,所以你可以指定你想要的行。

例子:

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

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

使用本。 =)

0

您可以使用分頁如下嵌套查詢: 從4行到8行的尋呼,其中CustomerId是主鍵

SELECT Top 5 * FROM Customers WHERE Country ='Germany'AND CustomerId Not in(SELECT按客戶排名前3位客戶ID WHERE國家=按城市排列的'德國'訂單) 按城市排序;