【问题标题】:The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP, OFFSET or FOR XMLORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效,除非 TOP、OFFSET 或 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 子句毫无意义,一开始就不应该存在。

标签: sql sql-server sql-server-2014


【解决方案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 指出的正确答案是去掉那个排序条款。

    【讨论】:

      猜你喜欢
      • 2023-03-12
      • 1970-01-01
      • 2013-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多