sql - CTE、ROW_NUMBER 和 ROWCOUNT

标签 sql sql-server common-table-expression row-number rowcount

我试图返回一页数据以及一个存储过程中所有数据的行数,如下所示:

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 有 100k 条记录,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 ...

注意:经过重新编辑,David 现在引用的查询 1 已被删除,查询 2 现在是查询 1。

关于sql - CTE、ROW_NUMBER 和 ROWCOUNT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7436732/

相关文章:

sql - 窗口 SQL 范围的 COUNT(*)

sql - 具有纯选择结果的 SQL 函数

sql-server - 如何在 SQL Server 2008 中获取重复 ID 序列中的下一个日期

sql - 如何编写 "streak"查询?

sql - 在 Snowflake 的公用表表达式中使用 "match_recognize"

sql-server - 层次结构中子级别的总和

c# - 单个全局变量 asp.net

sql - Postgres - 如何对窗口函数列的每 x 行求和?

MySQL AND 与 OR 条件

sql-server - 连接派生表时获取 “No column was specified for column 1"