除非TOP,OFFSET或FOR XML

时间:2017-08-16 09:46:01

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

我收到此错误:

  

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

2 个答案:

答案 0 :(得分:2)

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

现在我已经解释了你得到的错误消息背后的原因,这里是解决方案 - 只需从派生表中删除for xml子句:

order by

答案 1 :(得分:0)

使用订单膨胀子查询是不合理的,因为更多外部查询生病了"参见"只是结果数据集,并以与数据集顺序无关的相同方式使用它。如果你想要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指出的正确答案是摆脱那个排序条款。