0

可能重复:
相当于 SQL Server 的 LIMIT 和 OFFSET?

我正在处理一个当前包含 2500 行的表,并且将来会越来越多。

我正在使用 jqgrid 来显示数据库中的记录。

每当加载网格时,我都会top 500从数据库中检索行。但是,当我开始在网格中使用分页时,记录的数量正在增加。

示例:首先行数是TOP 100,然后在查询中进入下一页,其增加到TOP 200等等。

现在我想要一个解决方案来避免这个问题,这样我就可以限制行而不是根据网格检索前 n 行。说使用范围或LIMIT

例子

当我导航到网格中的下一页时,TOP 200我想获取从 101 到 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 的新手,不太了解如何处理这些与数据库相关的东西

我还在 Stackoverflow 中提到了一些链接,但无法理解

提前致谢

4

1 回答 1

5

您可以使用ROW_NUMBER(),在row_number()查询数据之前不会分配 ,因此如果要按row_number()值检索数据,则需要使用CTEor 子选择来获取在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
于 2012-08-23T11:04:02.680 回答