【问题标题】:custom paging using ROW_NUMBER() in sql for asp.net gridview在 asp.net gridview 的 sql 中使用 ROW_NUMBER() 自定义分页
【发布时间】:2014-04-21 17:15:08
【问题描述】:

我正在尝试使用 sql 中的 ROW_NUMBER() 在 asp.net 中为 gridview 实现自定义分页。下面的(经典)查询效果很好,但是它的性能不是很好,因为我必须将整个表复制到一个新表中,然后从新表中选择 20 条记录。它有时甚至在不分页的情况下效果更好,只需一次检索所有记录。我尝试在 where 子句中使用 ROW_NUMBER() 但 sql 不允许我这样做。如何改进下面的查询?你有什么建议?我想我需要找到一种方法来消除将整个数据集复制到新表的过程,但是如何?

SELECT PostId, Message, (ROW_NUMBER() OVER (ORDER BY LastUpdateDateTime DESC)) as Row   

INTO #Results   
FROM   Posts
WHERE  Posts.TimePointId=@TimePointId AND IsFixed=0 

ORDER BY LastUpdateDateTime DESC

-----------------------------------------------------


SELECT * FROM #Results
WHERE Row BETWEEN(@PageIndex -1) * @PageSize + 1 AND(((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1

DROP TABLE #Results

【问题讨论】:

    标签: c# asp.net sql sql-server gridview


    【解决方案1】:

    你真的不需要使用临时表来进行如此简单的操作,只需使用子查询或 CTE。

    使用子查询

    SELECT * 
    FROM (
    SELECT PostId, Message, (ROW_NUMBER() OVER (ORDER BY LastUpdateDateTime DESC)) as Row    
    FROM   Posts
    WHERE  Posts.TimePointId=@TimePointId AND IsFixed=0 
    ) Sub
    WHERE Row BETWEEN(@PageIndex -1) * @PageSize + 1 
    AND(((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1
    

    使用 CTE

    ;WITH CTE
    AS
     (
        SELECT PostId, Message, (ROW_NUMBER() OVER (ORDER BY LastUpdateDateTime DESC)) as Row     
        FROM   Posts
        WHERE  Posts.TimePointId=@TimePointId AND IsFixed=0 
     )
    SELECT * 
    FROM CTE
    WHERE Row BETWEEN(@PageIndex -1) * @PageSize + 1 
    AND(((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1
    

    【讨论】:

    • 我已经尝试过了,但它无法识别 Row: Invalid column name 'Row'。
    • @erkaner 你使用了子查询吗???您需要使用子查询,行号对生成它的查询不可见。您需要使用子查询或 CTE 来根据行号操作结果。
    【解决方案2】:

    我不确定这是否能解决您的性能问题,您可以使用子查询代替临时表:

    SELECT p.*
    FROM (SELECT PostId, Message, (ROW_NUMBER() OVER (ORDER BY LastUpdateDateTime DESC)) as Row    
          FROM   Posts
          WHERE  Posts.TimePointId=@TimePointId AND IsFixed=0 
         ) p
    WHERE Row BETWEEN(@PageIndex -1) * @PageSize + 1 AND(((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1;
    

    【讨论】:

      【解决方案3】:

      你可以使用CTE;

      ;With CTE as
      (
      SELECT PostId, Message, (ROW_NUMBER() OVER (ORDER BY LastUpdateDateTime DESC)) as Row   
      FROM   Posts
      WHERE  Posts.TimePointId=@TimePointId AND IsFixed=0 
      
      ORDER BY LastUpdateDateTime DESC
      
      )SELECT Row,* FROM CTE
      WHERE Row BETWEEN(@PageIndex -1) * @PageSize + 1 AND(((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-03
        • 1970-01-01
        • 1970-01-01
        • 2011-04-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多