你現在可以做到。
所有你需要做的是寫一個需要查詢和每頁和的PageNumber擴展方法,那麼你就需要追加
OFFSET @PageSize * (@PageNumber - 1) ROWS FETCH NEXT @PageSize ROWS ONLY;
線查詢和執行。
請注意,查詢絕對需要ORDER-BY子句(至少在T-SQL中)。
這適用於MS-SQL(2012+),PostgreSQL(8.4+)和Oracle(12c +)。
對於MySQL,您必須添加LIMIT偏移量page_size。
LIMIT @PageSize * (@PageNumber - 1), @PageSize
對於火鳥,你就必須追加行X到Y
ROWS (@PageSize * (@PageNumber - 1)) TO (@PageSize * @PageNumber -1)
對於基1指數,這將是從startoffset_base1到endoffset_base1
StartAt @PageSize * (pagenum - 1) + 1 EndAt @PageSize * (pagenum - 1) + @PageSize
示例:
DECLARE @PageSize int
DECLARE @PageNumber int
SET @PageSize = 5
SET @PageNumber = 2
SELECT * FROM T_Users
ORDER BY USR_ID
-- Must contain "ORDER BY"
OFFSET @PageSize * (@PageNumber - 1) ROWS FETCH NEXT @PageSize ROWS ONLY;
有關各種不同的RDBMS語法,請參閱
http://www.jooq.org/doc/3.5/manual/sql-building/sql-statements/select-statement/limit-clause/
驗證:
DECLARE @PageSize int
SET @PageSize = 5
;WITH CTE AS
(
SELECT 1 as pagenum
UNION ALL
SELECT pagenum+1 AS pagenum
FROM CTE
WHERE CTE.pagenum < 100
)
SELECT
pagenum
,@PageSize * (pagenum - 1) AS StartOFFSETBase0
--,@PageSize * (pagenum - 1) + @PageSize - 1 AS EndOFFSETBase0
,@PageSize * pagenum - 1 AS EndOFFSETBase0 -- Simplified
,@PageSize * (pagenum - 1) + 1 AS StartOFFSETBase1
,@PageSize * (pagenum - 1) + @PageSize AS EndOFFSETBase1
FROM CTE
是,也牢記這是數據庫依賴,Oracle和MySQL的有限制和偏移,迪納利,抵消等等。 – 2011-05-07 11:08:51
**其中**應位於內部查詢中,否?你應該在最後的查詢(cc @Sam)上使用rownum **顯式的**命令。 – 2011-05-07 11:28:39
@Marc是的,你需要一個命令,然後結束..內部查詢中可能需要或可能不需要的地方,有時你可以添加一個TOP @y到內部查詢來獲得一個性能提升 – 2011-05-07 11:30:47