在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
新關鍵詞offset
和fetch 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
非常感謝!這真是一個很好的答案! 只有關於sql 2008的問題。我希望ORDER BY在WHERE之前發生,因爲它現在將對子集進行排序,但我們希望從整個集合中選擇一些...任何想法? :) 再次,謝謝 –
如果我確實瞭解你,你想按LastDate排序,對不對?那麼我們可以這樣改變OVER()子句:ROW_NUMBER()OVER(ORDER BY ** MAX(Datemade)desc **)。 *並刪除最後的ORDER BY PostId *。現在CTE應該根據需要「儘快」排序。正確? –
謝謝你的幫助,關於2012樣本的一個註釋,order by是強制性的,我正在嘗試這個沒有order by子句並且得到了錯誤「不正確的語法」,不知道什麼是錯誤的,直到我查看MSDN語法並且通過is強制性的。 – Esen