加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql – CTE,ROW_NUMBER和ROWCOUNT

发布时间:2020-12-12 08:42:11 所属栏目:MsSql教程 来源:网络整理
导读:我试图在一个存储过程中返回一页数据以及所有数据的行计数,如下所示: WITH Props AS( SELECT *,ROW_NUMBER() OVER (ORDER BY PropertyID) AS RowNumber FROM Property WHERE PropertyType = @PropertyType AND ...) SELECT * FROM Props WHERE RowNumber BET
我试图在一个存储过程中返回一页数据以及所有数据的行计数,如下所示:
WITH Props AS
(
    SELECT *,ROW_NUMBER() OVER (ORDER BY PropertyID) AS RowNumber
    FROM Property
    WHERE PropertyType = @PropertyType AND ...
)   

SELECT * FROM Props 
WHERE RowNumber BETWEEN ((@PageNumber - 1) * @PageSize) + 1 AND (@PageNumber * @PageSize);

我无法返回行数(最高行号).

我知道这已经被讨论了(我看过这个:
Efficient way of getting @@rowcount from a query using row_number),但是当我在CTE中添加COUNT(x)OVER(PARTITION BY 1)时,性能下降,上面的查询通常不花时间永久执行.我认为这是因为计数是为每一行计算的?我似乎无法在另一个查询中重用CTE. Table Props拥有10万条记录,CTE返回5k条记录.

解决方法

在T-SQL中应该是
;WITH Props AS
(
    SELECT *,ROW_NUMBER() OVER (ORDER BY PropertyID) AS RowNumber
    FROM Property
    WHERE PropertyType = @PropertyType AND ...
),Props2 AS
(
    SELECT COUNT(*) CNT FROM Props
)

-- Now you can use even Props2.CNT
SELECT * FROM Props,Props2
WHERE RowNumber BETWEEN ((@PageNumber - 1) * @PageSize) + 1 AND (@PageNumber * @PageSize);

现在你有CNT在每一行…或者你想要一些不同的东西?你想要一个只有计数的第二个结果集?然后做吧!

-- This could be the second result-set of your query.
SELECT COUNT(*) CNT
FROM Property
WHERE PropertyType = @PropertyType AND ...

注意:reedited,查询1 David正在引用现在已经被垃圾邮件了,查询2现在是查询1.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读