繁体   English   中英

在asp.net gridview中使用ROW_NUMBER()在SQL中进行自定义分页

[英]custom paging using ROW_NUMBER() in sql for asp.net gridview

我正在尝试使用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

您真的不需要使用临时表来进行如此简单的操作,只需使用子查询或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

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

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;

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM