SQL Server:是不是有替代 TOP 子句的方法? [复制]

Posted

技术标签:

【中文标题】SQL Server:是不是有替代 TOP 子句的方法? [复制]【英文标题】:SQL Server : is there any alternate for TOP clause? [duplicate]SQL Server:是否有替代 TOP 子句的方法? [复制] 【发布时间】:2012-08-18 21:03:05 【问题描述】:

可能重复:Equivalent of LIMIT and OFFSET for SQL Server?

我正在处理一个当前包含 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 的新手,不太了解如何处理这些与数据库相关的东西

我还提到了 *** 中的一些链接,但看不懂

提前致谢

【问题讨论】:

你已经用 sql-server 和 oracle 标记了这个你想要哪个 RDBMS 的解决方案? 对不起,我想要它用于 sqlserver 【参考方案1】:

您可以使用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

【讨论】:

谢谢,所以我第一次检索 500 条记录,从下一次我必须动态地将值传递给 between 子句吗? 您可以创建一个存储过程,您只需为要检索的每个集合传入参数即可。如果您不想要全部记录,则无需返回 500 条记录。 :) @john conde 感谢您的编辑,我想我没有意识到我在复制/粘贴时切断了第一个字符。 :) @bluefeet,最好是“你”中的第一个字符,然后在查询中丢失一个字符!

以上是关于SQL Server:是不是有替代 TOP 子句的方法? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server order by 子句不使用 top 等

SQL Server MERGE 语句和 ORDER BY 子句

SQL Server Update:使用 TOP 限制更新的数据

SQL SERVER语句提示错误 delete top (5) FROM (SELECT top 100 percent * FROM 表名 ORDER BY DATE0) a

在 sql server 中搜索 LEN() 函数的替代项以进行优化

等效于 SQL SERVER 的 MySQL LIMIT 子句