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
相关产品推荐
相关产品推荐

