使用偏移量
其他人已经解释了如何使用ROW_NUMBER() OVER() 排名功能来执行页面。值得一提的是,SQL Server 2012 终于包含了对 SQL 标准 OFFSET .. FETCH 子句的支持:
SELECT first_name, last_name, score
FROM players
ORDER BY score DESC
OFFSET 40 ROWS FETCH NEXT 10 ROWS ONLY
如果您使用的是 SQL Server 2012 并且向后兼容性不是问题,您可能应该更喜欢这个子句,因为在极端情况下 SQL Server 会更优化地执行它。
使用 SEEK 方法
有一种完全不同的、更快的方式在 SQL 中执行分页。这通常被称为this blog post here 中描述的“seek 方法”。
SELECT TOP 10 first_name, last_name, score
FROM players
WHERE (score < @previousScore)
OR (score = @previousScore AND player_id < @previousPlayerId)
ORDER BY score DESC, player_id DESC
@previousScore 和@previousPlayerId 值分别是上一页最后一条记录的值。这允许您获取“下一页”。如果ORDER BY 方向是ASC,只需使用> 代替。
使用上述方法,您不能在没有先获取前 40 条记录的情况下立即跳转到第 4 页。但通常,无论如何你都不想跳那么远。相反,您将获得更快的查询,该查询可能能够在恒定时间内获取数据,具体取决于您的索引。此外,无论基础数据是否发生变化(例如,在第 1 页上,当您在第 4 页上时),您的网页都会保持“稳定”。
这是在 web 应用程序中延迟加载更多数据时实现分页的最佳方式。
注意,“seek 方法”也称为keyset paging。