【发布时间】:2017-01-07 07:09:35
【问题描述】:
我在存储过程中有这个查询):
SELECT *
FROM
dbo.JointHistory c
OUTER APPLY
(SELECT
MAX(CASE NdtType WHEN 'RT' THEN RequestNumber END) AS MasterRTRequestNumber,
MAX(CASE NdtType WHEN 'RT' THEN NdtReportNumber END) AS ContractorRTRequestNumber,
MAX(CASE NdtType WHEN 'RT' THEN ResponseReportNumber END) AS ContractorRTReportNumber,
MAX(CASE NdtType WHEN 'RT' THEN ResponseReportDatetime END) AS RTDate,
MAX(CASE NdtType WHEN 'RT' THEN Defect END) AS RTDefect,
MAX(CASE NdtType WHEN 'RT' THEN Remark END) AS RTSegment,
MAX(CASE NdtType WHEN 'PT' THEN RequestNumber END) AS MasterPTRequestNumber,
MAX(CASE NdtType WHEN 'PT' THEN NdtReportNumber END) AS ContractorPTRequestNumber,
MAX(CASE NdtType WHEN 'PT' THEN ResponseReportNumber END) AS ContractorPTReportNumber,
MAX(CASE NdtType WHEN 'PT' THEN ResponseReportDatetime END) AS PTDate,
MAX(CASE NdtType WHEN 'PT' THEN Defect END) AS PTDefect,
MAX(CASE NdtType WHEN 'PT' THEN Remark END) AS PTSegment,
MAX(CASE NdtType WHEN 'PWHT' THEN RequestNumber END) AS MasterPWHTRequestNumber,
MAX(CASE NdtType WHEN 'PWHT' THEN NdtReportNumber END) AS ContractorPWHTRequestNumber,
MAX(CASE NdtType WHEN 'PWHT' THEN ResponseReportNumber END) AS ContractorPWHTReportNumber,
MAX(CASE NdtType WHEN 'PWHT' THEN ResponseReportDatetime END) AS PWHTDate,
MAX(CASE NdtType WHEN 'PWHT' THEN Defect END) AS PWHTDefect,
MAX(CASE NdtType WHEN 'PWHT' THEN Remark END) AS PWHTSegment,
MAX(CASE NdtType WHEN 'MT' THEN RequestNumber END) AS MasterMTRequestNumber,
MAX(CASE NdtType WHEN 'MT' THEN NdtReportNumber END) AS ContractorMTRequestNumber,
MAX(CASE NdtType WHEN 'MT' THEN ResponseReportNumber END) AS ContractorMTReportNumber,
MAX(CASE NdtType WHEN 'MT' THEN ResponseReportDatetime END) AS MTDate,
MAX(CASE NdtType WHEN 'MT' THEN Defect END) AS MTDefect,
MAX(CASE NdtType WHEN 'MT' THEN Remark END) AS MTSegment,
MAX(CASE NdtType WHEN 'UT' THEN RequestNumber END) AS MasterUTRequestNumber,
MAX(CASE NdtType WHEN 'UT' THEN NdtReportNumber END) AS ContractorUTRequestNumber,
MAX(CASE NdtType WHEN 'UT' THEN ResponseReportNumber END) AS ContractorUTReportNumber,
MAX(CASE NdtType WHEN 'UT' THEN ResponseReportDatetime END) AS UTDate,
MAX(CASE NdtType WHEN 'UT' THEN Defect END) AS UTDefect,
MAX(CASE NdtType WHEN 'UT' THEN Remark END) AS UTSegment
FROM
(SELECT TOP 1 WITH TIES
NRD.NdtType, NRD.RequestNumber, NR.NdtReportNumber,
NRD.ResponseReportDatetime, NRD.Defect,
NRD.ResponseReportNumber, NRD.Remark
FROM
dbo.NdtReportDetails NRD
LEFT OUTER JOIN
NdtReports NR ON NRD.ReportId = NR.Id
WHERE
NRD.JointId = c.Id
AND NRD.NdtType IN ( 'RT', 'PT', 'PWHT', 'MT', 'UT' )
ORDER BY
NRD.Id DESC) i) b
但是基于这个问题:https://stackoverflow.com/questions/41518618/select-top-ties-in-sql-cant-return-expected-data/41518699查询结束有问题
所以我的查询变成了这样:
SELECT *
FROM dbo.JointHistory c
OUTER Apply (SELECT Max(CASE NdtType WHEN 'RT' THEN RequestNumber END) AS MasterRTRequestNumber,
Max(CASE NdtType WHEN 'RT' THEN NdtReportNumber END) AS ContractorRTRequestNumber,
Max(CASE NdtType WHEN 'RT' THEN ResponseReportNumber END) AS ContractorRTReportNumber,
Max(CASE NdtType WHEN 'RT' THEN ResponseReportDatetime END) AS RTDate,
Max(CASE NdtType WHEN 'RT' THEN Defect END) AS RTDefect,
Max(CASE NdtType WHEN 'RT' THEN Remark END) AS RTSegment,
Max(CASE NdtType WHEN 'PT' THEN RequestNumber END) AS MasterPTRequestNumber,
Max(CASE NdtType WHEN 'PT' THEN NdtReportNumber END) AS ContractorPTRequestNumber,
Max(CASE NdtType WHEN 'PT' THEN ResponseReportNumber END) AS ContractorPTReportNumber,
Max(CASE NdtType WHEN 'PT' THEN ResponseReportDatetime END) AS PTDate,
Max(CASE NdtType WHEN 'PT' THEN Defect END) AS PTDefect,
Max(CASE NdtType WHEN 'PT' THEN Remark END) AS PTSegment,
Max(CASE NdtType WHEN 'PWHT' THEN RequestNumber END) AS MasterPWHTRequestNumber,
Max(CASE NdtType WHEN 'PWHT' THEN NdtReportNumber END) AS ContractorPWHTRequestNumber,
Max(CASE NdtType WHEN 'PWHT' THEN ResponseReportNumber END) AS ContractorPWHTReportNumber,
Max(CASE NdtType WHEN 'PWHT' THEN ResponseReportDatetime END) AS PWHTDate,
Max(CASE NdtType WHEN 'PWHT' THEN Defect END) AS PWHTDefect,
Max(CASE NdtType WHEN 'PWHT' THEN Remark END) AS PWHTSegment,
Max(CASE NdtType WHEN 'MT' THEN RequestNumber END) AS MasterMTRequestNumber,
Max(CASE NdtType WHEN 'MT' THEN NdtReportNumber END) AS ContractorMTRequestNumber,
Max(CASE NdtType WHEN 'MT' THEN ResponseReportNumber END) AS ContractorMTReportNumber,
Max(CASE NdtType WHEN 'MT' THEN ResponseReportDatetime END) AS MTDate,
Max(CASE NdtType WHEN 'MT' THEN Defect END) AS MTDefect,
Max(CASE NdtType WHEN 'MT' THEN Remark END) AS MTSegment,
Max(CASE NdtType WHEN 'UT' THEN RequestNumber END) AS MasterUTRequestNumber,
Max(CASE NdtType WHEN 'UT' THEN NdtReportNumber END) AS ContractorUTRequestNumber,
Max(CASE NdtType WHEN 'UT' THEN ResponseReportNumber END) AS ContractorUTReportNumber,
Max(CASE NdtType WHEN 'UT' THEN ResponseReportDatetime END) AS UTDate,
Max(CASE NdtType WHEN 'UT' THEN Defect END) AS UTDefect,
Max(CASE NdtType WHEN 'UT' THEN Remark END) AS UTSegment
FROM (
SELECT t.NdtType,
t.RequestNumber,
t.NdtReportNumber,
t.ResponseReportDatetime,
t.Defect,
t.ResponseReportNumber,
t.Remark
FROM
(
SELECT NRD.NdtType,
NRD.Id,
NRD.RequestNumber,
NR.NdtReportNumber,
NRD.ResponseReportDatetime,
NRD.Defect,
NRD.ResponseReportNumber,
NRD.Remark,
ROW_NUMBER() OVER(PARTITION BY NRD.NdtType ORDER BY NRD.Id DESC) AS rn
FROM dbo.NdtReportDetails NRD
LEFT OUTER JOIN NdtReports NR
ON NRD.ReportId = NR.Id
WHERE NRD.JointId = c.Id AND
NRD.NdtType IN ('RT', 'PT', 'PWHT', 'MT', 'UT')
) t
WHERE t.rn = 1
ORDER BY t.Id DESC
) i)b
如您所见,查询结束是根据上述问题更改的,执行此查询后,我收到此错误:
消息 1033,级别 15,状态 1,过程 SPJointHistory,第 72 行
ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效,除非还指定了 TOP、OFFSET 或 FOR XML。
【问题讨论】:
-
尝试将
ORDER BY移至外部选择。如果您考虑一下,在内部选择中使用order by是没有意义的,因为包装不一定遵守接收到的结果集的顺序。 -
错误信息很清楚。您对其中的哪一部分有理解困难?
-
@KenWhite 我不知道该怎么做
-
从子查询中删除 ORDER BY,这正是错误消息告诉您的内容。
标签: sql-server