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)
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收集数据
;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)
| 归档时间: |
|
| 查看次数: |
59966 次 |
| 最近记录: |