【问题标题】:How to use order by clause in inner query如何在内部查询中使用 order by 子句
【发布时间】:2013-01-06 13:10:15
【问题描述】:

我的内部查询中的 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

我做错了什么?
是否可以修复此查询以在查询的第一部分获取已订购的商品?

【问题讨论】:

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


【解决方案1】:

如错误所示,您不能在 CTE 中使用 ORDER BY

ORDER BY 不是必需的。在OVER 子句中指定顺序。您可以在最终查询中ORDER BY RowNum

【讨论】:

  • 谢谢。我没有看到我在OVER 子句中错过了desc
【解决方案2】:

错误本身会为您提供有关为什么不能使用它的所有信息... :) 正如@flem 所说。试试这个并根据您的需要进行设置。

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

否则,您可以创建不带order byCTE,然后使用带order byselect。 阅读更多this article

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-05
    • 1970-01-01
    • 1970-01-01
    • 2012-04-02
    • 1970-01-01
    • 1970-01-01
    • 2021-03-30
    相关资源
    最近更新 更多