You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server中带OFFSET/FETCH的SQL语句为何无法正常运行?

解决SQL Server分页查询的问题

我来帮你梳理下问题出在哪,以及怎么调整才能拿到你想要的结果~

问题根源:OFFSET参数设置错误

你当前写的分页语句,核心问题是OFFSET(跳过的行数)的数值算错了,导致查询范围重叠或者超出实际数据量:

  • 第一句OFFSET 0 ROWS FETCH NEXT 20 ROWS ONLY是对的,会返回前20条数据
  • 第二句OFFSET 19 ROWS是跳过19条,取20条的话,会和第一句重复第20条记录,而且覆盖的范围不是你想要的20-40
  • 第三句OFFSET 39 ROWS跳过39条后,剩下的记录数不足20条,虽然不会报错,但逻辑上不符合你“取最后10条”的需求

正确的分页语句

按照你要的「前20条、中间20条、最后10条」的需求,调整后的SQL如下:

1. 获取前20条(第1-20条)

SELECT * 
FROM Purchase 
WHERE dataOK = 'OK' 
ORDER BY PurchaseDate DESC, PurchaseId -- 建议加唯一键(比如PurchaseId)保证排序稳定,避免分页重复
OFFSET 0 ROWS 
FETCH NEXT 20 ROWS ONLY;

2. 获取接下来的20条(第21-40条)

这里需要跳过前20条,所以OFFSET设为20:

SELECT * 
FROM Purchase 
WHERE dataOK = 'OK' 
ORDER BY PurchaseDate DESC, PurchaseId
OFFSET 20 ROWS 
FETCH NEXT 20 ROWS ONLY;

3. 获取最后10条(第41-50条)

跳过前40条,直接取剩下的记录(即使写FETCH NEXT 20,SQL Server也会自动返回剩余的10条):

SELECT * 
FROM Purchase 
WHERE dataOK = 'OK' 
ORDER BY PurchaseDate DESC, PurchaseId
OFFSET 40 ROWS 
FETCH NEXT 20 ROWS ONLY;

额外小提示

  • 务必在ORDER BY中加入一个唯一标识列(比如表的主键):如果多条记录的PurchaseDate完全相同,单纯按日期排序可能会导致分页时出现重复或遗漏的情况,加上唯一键能确保排序的稳定性。
  • 如果你不确定符合条件的总记录数,可以先执行这条语句确认:
SELECT COUNT(*) 
FROM Purchase 
WHERE dataOK = 'OK';

内容的提问来源于stack exchange,提问作者Mika Jones

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:07:16