在PostgreSQL中,有Limit和Offset关键字,可以非常容易地对结果集进行分页。
SQL Server的等效语法是什么?
在PostgreSQL中,有Limit和Offset关键字,可以非常容易地对结果集进行分页。
SQL Server的等效语法是什么?
当前回答
-- @RowsPerPage can be a fixed number and @PageNumber number can be passed
DECLARE @RowsPerPage INT = 10, @PageNumber INT = 2
SELECT *
FROM MemberEmployeeData
ORDER BY EmployeeNumber
OFFSET @PageNumber*@RowsPerPage ROWS
FETCH NEXT 10 ROWS ONLY
其他回答
对我来说,一起使用OFFSET和FETCH很慢,所以我使用了TOP和OFFSET的组合,就像这样(这更快):
SELECT TOP 20 * FROM (SELECT columname1, columname2 FROM tablename
WHERE <conditions...> ORDER BY columname1 OFFSET 100 ROWS) aliasname
注意:如果在同一个查询中同时使用TOP和OFFSET:
SELECT TOP 20 columname1, columname2 FROM tablename
WHERE <conditions...> ORDER BY columname1 OFFSET 100 ROWS
然后你会得到一个错误,所以为了同时使用TOP和OFFSET,你需要用子查询来分离它。
如果你需要使用SELECT DISTINCT,那么查询如下:
SELECT TOP 20 FROM (SELECT DISTINCT columname1, columname2
WHERE <conditions...> ORDER BY columname1 OFFSET 100 ROWS) aliasname
注意:使用SELECT ROW_NUMBER和DISTINCT不适合我。
LIMIT的等效函数是SET ROWCOUNT,但是如果你想要通用的分页,最好这样写一个查询:
;WITH Results_CTE AS
(
SELECT
Col1, Col2, ...,
ROW_NUMBER() OVER (ORDER BY SortCol1, SortCol2, ...) AS RowNum
FROM Table
WHERE <whatever>
)
SELECT *
FROM Results_CTE
WHERE RowNum >= @Offset
AND RowNum < @Offset + @Limit
这里的优点是,如果您决定更改分页选项(或允许用户这样做),则可以将偏移量和限制参数化。
注意:@Offset参数应该使用基于1的索引,而不是普通的基于0的索引。
select top {LIMIT HERE} * from (
select *, ROW_NUMBER() over (order by {ORDER FIELD}) as r_n_n
from {YOUR TABLES} where {OTHER OPTIONAL FILTERS}
) xx where r_n_n >={OFFSET HERE}
注意: 这个解决方案只能在SQL Server 2005或更高版本中工作,因为这是实现ROW_NUMBER()的时候。
我能做到的最接近
select * FROM( SELECT *, ROW_NUMBER() over (ORDER BY ID ) as ct from [db].[dbo].[table] ) sub where ct > fromNumber and ct <= toNumber
我猜类似于select * from [db].[dbo]。[table] LIMIT 0,10
这个特性现在在SQL Server 2012中变得很容易。 这是从SQL Server 2012开始工作的。
在SQL Server中限制偏移量为11到20行:
SELECT email FROM emailTable
WHERE user_id=3
ORDER BY Id
OFFSET 10 ROWS
FETCH NEXT 10 ROWS ONLY;
订购方式:必需 OFFSET:可选的跳过行数 NEXT:所需的下一行数
参考:https://learn.microsoft.com/en-us/sql/t-sql/queries/select-order-by-clause-transact-sql