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 子句在视图中无效