在 SQL Server 中分页结果的最佳方法是什么?
在 SQL Server 中分页结果的最佳方法是什么?
如果你想在 SQL Server 2000、2005、2008 和 2012 中分页结果,同时还想获取分页前的总结果数,那么什么是最好的方法(性能最佳)?
admin 更改状态以发布 2023年5月22日
获取结果总数和分页是两个不同的操作。为了举例说明,假设你正在处理的查询是:\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应用程序的是,你不必保留任何状态,仅需要返回的行号即可。
最终,Microsoft SQL Server 2012已经发布,我真的很喜欢它在进行分页时的简单性,你不必像在此处回答的那样使用复杂的查询。
要获取接下来的10行,只需运行此查询:
SELECT * FROM TableName ORDER BY id OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;
在使用它时要考虑的关键点:
ORDER BY
是必须与OFFSET ... FETCH
子句一起使用的。OFFSET
子句与FETCH
子句是必须同时使用的。不能使用ORDER BY ... FETCH
。TOP
不能与同一个查询表达式中的OFFSET
和FETCH
结合使用。