Sql ORDER BY子句在视图、内联函数、派生表、子查询和公共表表达式中无效
ORDER BY子句在视图、内联函数和派生函数中无效 表、子查询和常用表表达式(除非为TOP)、偏移量 也为XML指定了or 我在尝试执行以下查询时遇到上述错误。谁能看一下,告诉我我做错了什么Sql ORDER BY子句在视图、内联函数、派生表、子查询和公共表表达式中无效,sql,sql-server,database,sql-server-2012,Sql,Sql Server,Database,Sql Server 2012,ORDER BY子句在视图、内联函数和派生函数中无效 表、子查询和常用表表达式(除非为TOP)、偏移量 也为XML指定了or 我在尝试执行以下查询时遇到上述错误。谁能看一下,告诉我我做错了什么 SELECT * FROM ( SELECT Stockmain.VRNOA, item.description as item_description, party.name as party_name, sto
SELECT
*
FROM (
SELECT
Stockmain.VRNOA,
item.description as item_description,
party.name as party_name,
stockmain.vrdate,
stockdetail.qty,
stockdetail.rate,
stockdetail.amount,
ROW_NUMBER() OVER (ORDER BY VRDATE) AS RowNum
FROM StockMain
INNER JOIN StockDetail
ON StockMain.stid = StockDetail.stid
INNER JOIN party
ON party.party_id = stockmain.party_id
INNER JOIN item
ON item.item_id = stockdetail.item_id
WHERE stockmain.etype='purchase'
ORDER BY VRDATE DESC
) AS MyDerivedTable
WHERE
MyDerivedTable.RowNum BETWEEN 1 and 5
您不需要在WHERE子句之后的内部查询中使用ORDER BY,因为您已经在ORDER BY VRDATE DESC的行号中使用了它
令人惊讶的是,它能工作,这是一个多么奇怪的特性
一个更大的例子是使用CTE临时存储一个长查询以便以后重新排序:
;WITH cte AS (
SELECT .....long select statement here....
)
SELECT * FROM
(
SELECT * FROM
( -- necessary to nest selects for union to work with where & order clauses
SELECT * FROM cte WHERE cte.MainCol= 1 ORDER BY cte.ColX asc OFFSET 0 ROWS
) first
UNION ALL
SELECT * FROM
(
SELECT * FROM cte WHERE cte.MainCol = 0 ORDER BY cte.ColY desc OFFSET 0 ROWS
) last
) as unionized
ORDER BY unionized.MainCol desc -- all rows ordered by this one
OFFSET @pPageSize * @pPageOffset ROWS -- params from stored procedure for pagination, not relevant to example
FETCH FIRST @pPageSize ROWS ONLY -- params from stored procedure for pagination, not relevant to example
所以我们得到了MainCol命令的所有结果
但是MainCol=1的结果由ColX排序
MainCol=0的结果按ColY排序orderby应该在子查询select之外,因为错误消息中给出了原因,所以不能使用orderby对派生表中的行进行排序。结果集中的行顺序最终由外部SELECT中的order by子句控制,而不是OVER子句控制。指定执行窗口函数计算的逻辑顺序。它不会对结果集进行排序。有谁能提供一点见解,解释一下为什么微软会要求这种荒谬的多余的额外语法吗?好吧,我会被诅咒的,它只是工作而已。我讨厌我必须这样做,但我喜欢解决方案如此简单。你在最上面的代码片段对我的查询来说是现成的。
ORDER BY column OFFSET 0 ROWS
;WITH cte AS (
SELECT .....long select statement here....
)
SELECT * FROM
(
SELECT * FROM
( -- necessary to nest selects for union to work with where & order clauses
SELECT * FROM cte WHERE cte.MainCol= 1 ORDER BY cte.ColX asc OFFSET 0 ROWS
) first
UNION ALL
SELECT * FROM
(
SELECT * FROM cte WHERE cte.MainCol = 0 ORDER BY cte.ColY desc OFFSET 0 ROWS
) last
) as unionized
ORDER BY unionized.MainCol desc -- all rows ordered by this one
OFFSET @pPageSize * @pPageOffset ROWS -- params from stored procedure for pagination, not relevant to example
FETCH FIRST @pPageSize ROWS ONLY -- params from stored procedure for pagination, not relevant to example