sql - 多次使用一个 CTE

标签 sql sql-server sql-server-2008 common-table-expression

我有这个,但在设置总数时出现错误。 为什么我无法多次访问 cte?

ALTER PROCEDURE [dbo].[GetLeaguePlayers]
(
    @idleague int,
    @pageNumber int,
    @pageSize int,
    @total int OUTPUT
)
AS
WITH CTEPlayers AS
(
    SELECT ROW_NUMBER() OVER (ORDER BY p.Name) AS RowNumber, p.Id, p.Name, t.Name AS Team
    FROM Players p INNER JOIN Teams t ON p.IdTeam=t.Id INNER JOIN Leagues l ON l.Id=t.IdLeague
    WHERE l.Id=@idleague
)
SELECT Id, Name
FROM CTEPlayers c
WHERE RowNumber>@pageSize*(@pageNumber-1) AND RowNumber<@pageSize*@pageNumber;
SET @total = ( SELECT COUNT(*) FROM CTEPlayers )

最佳答案

CTE 基本上是一次性 View 。它仅持续一条语句,然后自动消失。

您的选择包括:

  • 再次重新定义CTE。这就像从 WITH... 复制粘贴到定义末尾到 SET 之前一样简单。

  • 将结果放入 #temp 表或 @table 变量

  • 将结果具体化为真实表格并引用

  • 稍微更改为仅从 CTE 中选择 SELECT COUNT:

.

SELECT @total = COUNT(*)
FROM Players p 
INNER JOIN Teams t 
    ON p.IdTeam=t.Id 
INNER JOIN Leagues l 
    ON l.Id=t.IdLeague
WHERE l.Id=@idleague

关于sql - 多次使用一个 CTE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10196808/

相关文章:

c++ - Qt SQL - 配置数据库连接

sql - MySQL 复合索引和运算符 BETWEEN

sql-server - 查找 SQL Server 数据库是否存在有效的完整备份

sql - 当 monthid 为 2 位数字时,在 SQL Server 2008 R2 中连接失败

sql - 如何在 SQL Server 2008 中获取每组的第一条和最后一条记录?

sql-server - 如何向 sql server 2008 添加新架构?

sql - 如何在Oracle SQL中获取最接近的日期

mysql - 选择满足 where 子句的行以及共享公共(public)键的行

javascript - 从mssql模块中的异步函数返回数据

sql-server - 如何在 View 上创建聚簇索引