在CTE表达式中排序

时间:2010-09-02 20:23:18

标签: tsql

我正在从每个用户DESC的关注者数量排序的数据库中检索所有用户

 with TH_Users as
(
    SELECT [ID]
      ,[FullName]
      ,[UserName]
      ,[ImageName]
      ,dbo.GetUserFollowers(ID) AS Followers
, ROW_NUMBER() OVER (order by ID ) AS 'RowNumber' 
from dbo.TH_Users
Where CultureID = @cultureID

)
Select ID,[FullName]
      ,[UserName]
      ,[ImageName], Followers from TH_Users
Where RowNumber BETWEEN @startIdx AND @endIdx
Order BY Followers DESC

我正在使用一个函数来获取每个用户的关注者数量。现在是我的用户关注者列作为ROW_NUMBER()的列顺序OVER(按照订单排序)AS'RowNumber'

我收到编译错误。

在查询结束时放置订单BY关注者DESC将不会给出预期的结果。

有什么建议吗?

由于

1 个答案:

答案 0 :(得分:0)

当您使用AS为列提供别名时,该别名在查询中不可用 - 逻辑上,将别名应用于列(几乎)是最后一部分评估查询。

因此,如果您希望CTE ROW_NUMBER OVER的别名为Followers,则必须使用与列本身相同的术语表达它:

;with TH_Users as
(
    SELECT [ID]
      ,[FullName]
      ,[UserName]
      ,[ImageName]
      ,dbo.GetUserFollowers(ID) AS Followers
, ROW_NUMBER() OVER (order by dbo.GetUserFollowers(ID) ) AS 'RowNumber' 
from dbo.TH_Users
Where CultureID = @cultureID
)

请注意,会导致对该函数的评估次数超过当前时间。

(我没有测试过这个)