Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql ORDER BY子句在视图、内联函数、派生表、子查询和公共表表达式中无效_Sql_Sql Server_Database_Sql Server 2012 - Fatal编程技术网

Sql ORDER BY子句在视图、内联函数、派生表、子查询和公共表表达式中无效

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

ORDER BY子句在视图、内联函数和派生函数中无效 表、子查询和常用表表达式(除非为TOP)、偏移量 也为XML指定了or

我在尝试执行以下查询时遇到上述错误。谁能看一下,告诉我我做错了什么

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