如何在内部查询中使用order by子句

时间:2013-01-06 13:10:15

标签: sql sql-server database tsql stored-procedures

我的内部查询中的order by子句遇到了很大的麻烦 我使用此查询从数据库中获取分页结果:

;WITH ItemsRank AS
(
select
ROW_NUMBER() OVER(ORDER BY t.CreatedOnDate) AS RowNum, 
t.ItemId
from Tickets t
where t.CompanyId = @CompanyId
group by t.ItemId ...

order by t.CreatedOnDate desc -- this makes me trouble

) ,x as (
select ItemsRank.*, 
c.CommentText ...

WHERE RowNum > @p_From
    AND RowNum <= @p_From + 50
)
select * from x where RowNumComment <= 4


因为查询很大,我删除了所有选择,联接,组等。
如果我在查询结束时下订单,它可以工作,但不是预期的 因为查询的第一部分应该按降序排列前50个结果。

这是我得到的错误:

  

ORDER BY子句在视图,内联函数中派生无效   表,子查询和公用表表达式,除非TOP或FOR   还指定了XML

我做错了什么?
是否可以修复此查询以在查询的第一部分中获取有序项目?

2 个答案:

答案 0 :(得分:3)

如错误所示,您无法在CTE中使用ORDER BY

没有必要ORDER BY。您可以在OVER子句中指定顺序。您可以在最终查询中ORDER BY RowNum

答案 1 :(得分:1)

错误本身会为您提供有关无法使用的所有信息... :)正如@flem所说。尝试这个并按照您的要求设置。

ROW_NUMBER() OVER(ORDER BY t.CreatedOnDate desc) AS RowNum, 

否则,您可以创建CTE而不order by,然后使用select order by。 详细了解this article