多次使用一个CTE

gig*_*igi 51 sql sql-server common-table-expression sql-server-2008

我有这个,我在设定总数时得到一个错误.为什么我不能多次访问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 )
Run Code Online (Sandbox Code Playgroud)

JNK*_*JNK 62

A CTE基本上是一次性视图.它仅持续存在于单个语句中,然后自动消失.

您的选择包括:

  • CTE第二次重新定义.这就像复制粘贴从WITH...定义结尾到你之前一样简单SET.

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

  • 将结果物化为真实表并引用该表

  • SELECT COUNT从您的CTE 稍微改变一下:

.

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
Run Code Online (Sandbox Code Playgroud)

  • CTE不限于单个查询,而是限制在单个语句中.您可以让多个查询使用相同的CTE(如果嵌套,则在其他CTE中等). (12认同)
  • @Aaron 我只是尝试准确地使用术语。 (2认同)

om4*_*987 18

上述答案都不正确...您可以执行一次CTE并获得您想要的结果..这是查询

ALTER PROCEDURE [dbo].[GetLeaguePlayers]
(
    @idleague int,
    @pageNumber int,
    @pageSize int,
    @total int OUTPUT
)
AS
WITH CTEPlayers AS
(
    SELECT 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
),
TotalCount AS
(
 SELECT COUNT(*) AS Total FROM CTEPlayers
),
Final_Result AS
(
 SELECT ROW_NUMBER() OVER (ORDER BY p.Name) AS RowNumber, p.Id, p.Name, t.Name AS Team,
  (SELECT Total FROM TotalCount) AS Total
    FROM CTEPlayers
)
SELECT Id, Name, @total = Total
FROM Final_Results c
WHERE RowNumber>@pageSize*(@pageNumber-1) AND RowNumber<@pageSize*@pageNumber;
Run Code Online (Sandbox Code Playgroud)

  • 这似乎仅限于只读操作。尝试更新相同的结果集会导致基于与第一个 CTE 的联接的有效更新语句出现错误。 (2认同)

Luc*_*ero 12

根据定义,CTE仅对一个语句有效.

您可以创建内联表值函数,然后根据需要随时使用它.内联函数的作用与名称相同; 它的查询使用它成为查询的一部分(与单独执行并用作行集的非内联函数形成对比).


Aru*_*E S 5

多次使用CTE收集数据

;with CTEReminder AS
(
    Select r.ReminderID,r.IsVerificationRequired from ReminderTbl r      -- main table
),
FileTaskCountTempTbl   as     
    (
        select  COUNT(t.ReminderID) as FileTaskCount                     -- getting first result
            from TaskTbl t
                left join CTEReminder r on t.ReminderID = r.ReminderID          
    ),
FollowUpCountTempTbl  as
    (
        select COUNT(f.FollowUpID)  as Total                             -- getting second result
            from FollowUpTbl f              --cte not used here
    ),
MachineryRegularTaskCountTempTbl as
    (
        select  COUNT(t.ReminderID) as TotalCount                        -- getting third result
                from TaskTbl t
                    left join CTEReminder r on t.ReminderID = r.ReminderID                  
    ),
FinalResultTempTbl as
    (
        select COUNT(t.ReminderID)  as MachineryTaskCount,               -- getting fourth result
                (select * from MachineryRegularTaskCountTempTbl ) as MachineryRegularTaskCount,  -- Combining earlier results to last query 
                (select * from FollowUpCountTempTbl ) as FollowUpCount,   -- Combining earlier results to last query 
                (select * from FileTaskCountTempTbl ) as FileTaskCount   -- Combining earlier results to last query 
            from TaskTbl t
                left join CTEReminder r on t.ReminderID = r.ReminderID          
    )

select * from FinalResultTempTbl 
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述