可能重复:
SQL Server的LIMIT和OFFSET等价物?
我正在处理一个表,该表目前包含2500行,将来还会越来越多。
我正在使用jqgrid来显示数据库中的记录。
每当加载网格时,我都会从数据库中检索top 500
行。然而,当我开始在网格中使用分页时,记录的数量正在增加。
示例:首先,行数为TOP 100
,然后转到下一页,查询中的行数增加为TOP 200
,依此类推。
现在我想要一个解决方案来避免这个问题,这样我就可以限制行,而不是基于网格检索前n行。比如使用测距仪或LIMIT
示例
当我导航到网格中的下一页时,我想从101到200 中提取行,而不是TOP 200
行
select top 500
exe.id,
bat.BName,
bat.tid,
bat.freq,
exe.status,
exe.Msg,
exe.time,
exe.Fi
from
XXX exe,
YYY bat
where
exe.id=bat.id
order by
CONVERT(VARCHAR(10),
exe.time,
120) DESC,
exe.status,
exe.id DESC
请指导我,因为我是jQGrid的新手,不太知道如何处理这个与DB相关的东西
我也提到了Stackoverflow中的一些链接,但无法理解
提前感谢
您可以使用ROW_NUMBER()
,在查询数据之前不会分配row_number()
,因此如果您想通过row_number()
值检索数据,则需要使用CTE
或子选择来获取WHERE
子句中使用的值。
SELECT *
FROM
(
select exe.id,
bat.BName,
bat.tid,
bat.freq,
exe.status,
exe.Msg,
exe.time,
exe.Fi,
row_number() over(order by CONVERT(VARCHAR(10), exe.time, 120) DESC,
exe.status, exe.id DESC) rn
from XXX exe,
YYY bat
where exe.id=bat.id
) x
WHERE rn between 101 and 200
我还建议将JOIN
语法更改为使用ANSI语法:
SELECT *
FROM
(
select exe.id,
bat.BName,
bat.tid,
bat.freq,
exe.status,
exe.Msg,
exe.time,
exe.File,
row_number() over(order by CONVERT(VARCHAR(10), exe.time, 120) DESC,
exe.status, exe.id DESC) rn
from XXXexe
INNER JOIN YYY bat
ON exe.id=bat.id
) x
WHERE rn between 101 and 200