【问题标题】:Getting rows within a specified range for pagination获取指定范围内的行进行分页
【发布时间】:2013-06-27 20:50:24
【问题描述】:

我正在尝试编写一个查询来实现分页,我的基本要求是我需要一个查询,我可以在其中给出最小和最大范围的行以返回例如对于第 1 页,我需要从 1-10 记录到第 11-20 页,依此类推。

通过互联网的一些帮助,在这里,我已经写下了以下查询,但它并没有真正按照它应该的方式工作,并且无论范围是多少,都会返回一大堆行(可能我在查询)

SELECT b.id,b.title,b.name
FROM (
    SELECT ROW_NUMBER() OVER(ORDER BY (select NULL as noorder)) AS RowNum, * 
    FROM [student] b
) as alias,[student] b,[class] c
WHERE b.[status]=1 
AND c.id=b.class 
AND c.name='Science' 
AND RowNum BETWEEN 1 AND 5
ORDER BY b.dtetme DESC

我在修复它时迷路了,有人可以指出错误。 谢谢!

【问题讨论】:

标签: sql sql-server pagination


【解决方案1】:

您的整个查询逻辑 + ROW_NUMBER 应该放在子查询中。您使用外部WHERE 只是为了分页。

ROW_NUMBER 必须有 ORDER BY 以实现分页。

SELECT  a.id ,
        a.title ,
        a.name
FROM    
   ( 
        SELECT ROW_NUMBER() OVER (ORDER BY b.dtetme DESC) AS RowNum, b.*
        FROM  [student] b 
        INNER JOIN [class] c ON  c.id = b.class
        WHERE b.[status] = 1
        AND c.name = 'Science'
    ) a
WHERE RowNum BETWEEN 1 AND 10 -- change numbers here for pages
ORDER BY t.RowNum

【讨论】:

  • 上面写着The column 'id' was specified multiple times for 'a'.
  • @Maven 将子查询中的 * 替换为您实际需要的列。检查修改后的版本。
  • @Maven 错误是因为StudentClass 表中都有id 列。
【解决方案2】:

我认为问题在于在FROM 中添加了[student] b,请尝试将连接移动到子查询中。

SELECT a.id, a.title, a.name
FROM (
    SELECT ROW_NUMBER() OVER(ORDER BY (select NULL as noorder)) AS RowNum, * 
    FROM [student] b
    JOIN [class] c ON c.id = b.class
    WHERE b.[status]=1 
    AND c.name='Science' 
) as a
WHERE a.RowNum BETWEEN 1 AND 5
ORDER BY a.dtetme DESC

此外,您可能需要考虑将其包装在过程或函数中,以便更改范围。

【讨论】:

    【解决方案3】:

    看来你想要这样的东西:

    SELECT t.id,t.title,t.name FROM (
        SELECT s.id,s.title,s.name, RowNum = ROW_NUMBER() OVER(ORDER BY s.dtetme DESC)
        FROM student s
        INNER JOIN class c ON c.id = s.class
        WHERE s.[status]=1 AND c.name='Science' ) AS t
    WHERE t.RowNum BETWEEN 1 AND 5
    ORDER BY t.RowNum
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-25
      • 2013-08-25
      • 1970-01-01
      • 2018-12-27
      • 2016-06-04
      • 1970-01-01
      • 2018-05-13
      • 1970-01-01
      相关资源
      最近更新 更多