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

Posted

技术标签:

【中文标题】ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效,除非 TOP、OFFSET 或 FOR XML【英文标题】:The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP, OFFSET or FOR XML 【发布时间】:2017-08-16 09:46:00 【问题描述】:

我收到此错误:

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

这是我的查询:

SELECT * FROM
      (SELECT H.Plotingan as 'Plotingan',
              E.EmployeeName as 'Nama',
              E.EmployeePosition as 'Jabatan',
              E.EmployeeNo as 'NIK',
              D.Tanggal,D.DutyCode
        FROM CobaDutyDetail D
        JOIN CobaDutyHeader H
          ON D.CobaDutyHeaderID = H.IDHeaderDuty
        JOIN Employee E
          ON H.EmployeeID = E.EmployeeID
       WHERE E.WorkLocation = 'JAKARTA'
       ORDER BY D.CreatedOn DESC)AS SOURCETABLE
       PIVOT(MAX(DutyCode)FOR TANGGAL IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14],[15],[16],[17],[18],[19],[20],[21],[22],[23],[24],[25],[26],[27],[28],[29],[30]))AS PIVOTTABLE

【问题讨论】:

您在派生表中有一个订单... 错误信息很清楚。 你为什么需要这个ORDER BY 你试过删除ORDER BY D.CreatedOn DESC吗? @jimmy8ball 使用select top 100 percent 并不能解决问题,它正在解决错误消息。在希伯来语中,我们说“להכשיר את השרץ” - 意思是批准某事为“犹太洁食”,即使它不是。问题不在于错误信息,问题在于order by 子句毫无意义,一开始就不应该存在。 【参考方案1】:

关系模型指定关系的元组没有特定的顺序。换句话说,数据库表中的行没有特定的顺序。 因此,当您创建可以作为表引用的任何内容(即视图、派生表等)时,您不能指定 order by 子句,除非需要它来限制结果(使用 top 或 @ 987654323@). 您可以将order by 子句与for xml 子句一起使用,因为创建xml 与创建表不同。

现在我已经解释了您收到错误消息的原因,下面是解决方案 - 只需从派生表中删除 order by 子句:

SELECT * FROM
      (SELECT H.Plotingan as 'Plotingan',
              E.EmployeeName as 'Nama',
              E.EmployeePosition as 'Jabatan',
              E.EmployeeNo as 'NIK',
              D.Tanggal,D.DutyCode
        FROM CobaDutyDetail D
        JOIN CobaDutyHeader H
          ON D.CobaDutyHeaderID = H.IDHeaderDuty
        JOIN Employee E
          ON H.EmployeeID = E.EmployeeID
       WHERE E.WorkLocation = 'JAKARTA'
       ) AS SOURCETABLE
       PIVOT(MAX(DutyCode)FOR TANGGAL IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14],[15],[16],[17],[18],[19],[20],[21],[22],[23],[24],[25],[26],[27],[28],[29],[30])) AS PIVOTTABLE

【讨论】:

【参考方案2】:

使用 order by 使子查询膨胀是不合理的,因为更多的外部查询只会“看到”结果数据集,并且会以与数据集顺序无关的相同方式使用它。如果您非常想要ORDER BY,您可以填写一个临时表或表变量并使用它。

SELECT H.Plotingan as [Plotingan],
              E.EmployeeName as [Nama],
              E.EmployeePosition as [Jabatan],
              E.EmployeeNo as [NIK],
              D.Tanggal,D.DutyCode
into #temp
        FROM CobaDutyDetail D
        JOIN CobaDutyHeader H
          ON D.CobaDutyHeaderID = H.IDHeaderDuty
        JOIN Employee E
          ON H.EmployeeID = E.EmployeeID
       WHERE E.WorkLocation = 'JAKARTA'
       ORDER BY D.CreatedOn DESC)AS SOURCETABLE

SELECT * FROM #temp AS SOURCETABLE
       PIVOT(MAX(DutyCode)FOR TANGGAL IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14],[15],[16],[17],[18],[19],[20],[21],[22],[23],[24],[25],[26],[27],[28],[29],[30])) AS PIVOTTABLE

但这是不可取的。 Zohar 指出的正确答案是去掉那个排序条款。

【讨论】:

以上是关于ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效,除非 TOP、OFFSET 或 FOR XML的主要内容,如果未能解决你的问题,请参考以下文章

sqlserver 创建视图失败,原因:ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效

SQL Server查询错误-ORDER BY子句在视图中无效

SQL Server 查询错误 -ORDER BY 子句在视图中无效

子查询中的 Order By 的 SQL 错误

使用Union All 和Order By In View?

oracle不可以用order by么