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

SQL Server的等效语法是什么?


当前回答

对我来说,一起使用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 (@TakeCount) * --FETCH NEXT
from(
    Select  ROW_NUMBER() OVER (order by StartDate) AS rowid,*
    From YourTable
)A
where Rowid>@SkipCount --OFFSET

特别是对于SQL-SERVER,您可以通过许多不同的方式实现这一点。对于给定的真实例子,我们取Customer表。

例1:使用"SET ROWCOUNT"

SET ROWCOUNT 10
SELECT CustomerID, CompanyName from Customers
ORDER BY CompanyName

若要返回所有行,请将ROWCOUNT设置为0

SET ROWCOUNT 0  
SELECT CustomerID, CompanyName from Customers
    ORDER BY CompanyName

例2:使用"ROW_NUMBER and OVER"

With Cust AS
( SELECT CustomerID, CompanyName,
ROW_NUMBER() OVER (order by CompanyName) as RowNumber 
FROM Customers )
select *
from Cust
Where RowNumber Between 0 and 10

例3:使用“OFFSET and FETCH”,但是使用这个“ORDER BY”是强制的

SELECT CustomerID, CompanyName FROM Customers
ORDER BY CompanyName
OFFSET 0 ROWS
FETCH NEXT 10 ROWS ONLY

希望这对你有所帮助。

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