在 SQL Server 中分页结果的最佳方法是什么?

25 浏览
0 Comments

在 SQL Server 中分页结果的最佳方法是什么?

如果你想在 SQL Server 2000、2005、2008 和 2012 中分页结果,同时还想获取分页前的总结果数,那么什么是最好的方法(性能最佳)?

admin 更改状态以发布 2023年5月22日
0
0 Comments

获取结果总数和分页是两个不同的操作。为了举例说明,假设你正在处理的查询是:\n

SELECT * FROM Orders WHERE OrderDate >= '1980-01-01' ORDER BY OrderDate

\n在这种情况下,你可以使用以下方法确定结果的总数:\n

SELECT COUNT(*) FROM Orders WHERE OrderDate >= '1980-01-01'

\n这可能看起来效率低下,但实际上,只要所有索引等都正确设置,就相当有效率。\n接下来,为了以分页方式返回实际结果,以下查询是最有效的:\n

SELECT  *
FROM    ( SELECT    ROW_NUMBER() OVER ( ORDER BY OrderDate ) AS RowNum, *
          FROM      Orders
          WHERE     OrderDate >= '1980-01-01'
        ) AS RowConstrainedResult
WHERE   RowNum >= 1
    AND RowNum < 20
ORDER BY RowNum

\n这将返回第1至19行的原始查询结果。特别适用于Web应用程序的是,你不必保留任何状态,仅需要返回的行号即可。

0
0 Comments

最终,Microsoft SQL Server 2012已经发布,我真的很喜欢它在进行分页时的简单性,你不必像在此处回答的那样使用复杂的查询。

要获取接下来的10行,只需运行此查询:

SELECT * FROM TableName ORDER BY id OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;

https://learn.microsoft.com/en-us/sql/t-sql/queries/select-order-by-clause-transact-sql#using-offset-and-fetch-to-limit-the-rows-returned

在使用它时要考虑的关键点:

  • ORDER BY是必须与OFFSET ... FETCH子句一起使用的。
  • OFFSET子句与FETCH子句是必须同时使用的。不能使用ORDER BY ... FETCH
  • TOP不能与同一个查询表达式中的OFFSETFETCH结合使用。
0