在PostgreSQL中,有Limit和Offset关键字,可以非常容易地对结果集进行分页。

SQL Server的等效语法是什么?


当前回答

@nombre_row :nombre ligne par page  
@page:numero de la page

//--------------code sql---------------

declare  @page int,@nombre_row int;
    set @page='2';
    set @nombre_row=5;
    SELECT  *
FROM    ( SELECT    ROW_NUMBER() OVER ( ORDER BY etudiant_ID ) AS RowNum, *
      FROM      etudiant

    ) AS RowConstrainedResult
WHERE   RowNum >= ((@page-1)*@nombre_row)+1
    AND RowNum < ((@page)*@nombre_row)+1
ORDER BY RowNum

其他回答

-- @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

我能做到的最接近

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

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()的时候。

对我来说,一起使用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不适合我。

详细阐述Somnath-Muluk的回答:

SELECT *
FROM table_name_here
ORDER BY (SELECT NULL AS NOORDER)
OFFSET 9 ROWS 
FETCH NEXT 25 ROWS ONLY 

W /o添加任何额外的列。 在SQL Server 2019中测试,但我猜也可以在旧的版本中工作。