普通表中的order by子句无效

时间:2018-03-20 11:16:14

标签: sql sql-server

抛出和错误“ORDER BY子句在视图,内联函数,派生表,子查询和公用表表达式中无效,除非还指定了TOP或FOR XML”。  当我使用前100%时,抛出不同的错误,就像多次使用的coloumn一样

2 个答案:

答案 0 :(得分:1)

查询缺少从CTE中选择数据,因此我们现在无法查看所有查询,但错误很明显。订购CTE无效,因为它输出的订单可以通过使用CTE本身的select查询重新排序。

考虑:

    WITH foo as (
         SELECT id,name FROM bar ORDER BY id ASC
    )
    SELECT * FROM foo ORDER BY name DESC

CTE内订单的含义或目的是什么?如果查询引擎服从它,它将无意地执行多余的排序工作。

您执行排序作为最后一步 - 作为中间步骤排序在TOP关键字的场景中有意义,您只需要基于订单的数据子集。

答案 1 :(得分:0)

您不理解错误消息的哪一部分? ORDER BY应仅位于最外层的查询中。

SQL表和结果集表示无序集。子查询和CTE也是如此。一个例外是最外层查询中允许ORDER BY对结果集进行排序。

WITH ord_dupes AS (   
      SELECT ROW_NUMBER() OVER (PARTITION BY bas2."BudgetTask__c", bas2."BudgetResource__c"
                                ORDER BY bas2."LastModifiedDate" DESC
                               ) as rk,
             bas2.*, bas2dupes.*  -- should list out the columns
    FROM bas2 INNER JOIN 
         bas2dupes
         ON bas2."BudgetTask__c" = bas2dupes."BudgetTask__c" AND 
            bas2."BudgetResource__c" = bas2dupes."BudgetResource__c"   
     )
SELECT od.*
FROM ord_dupes od
ORDER BY ? DESC ;

您的ORDER BY列为"BudgetTask__r.BudgetHeader__r.Project__r.ProjectNumber__c"。如果这是列的名称,则使用它。但是,如果是这样,我强烈建议您修复数据模型,这样就不会在列名中使用句点。

否则,只需为?添加正确的列。