2017-01-07 82 views
0

我有一個存儲過程中此查詢):SQL服務器:ORDER BY子句在視圖,內聯函數,派生表無效,子查詢

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 

正如你可以看到查詢的末尾改變基於上面的問題後,我執行這個查詢,我得到這個錯誤:

Msg 1033, Level 15, State 1, Procedure SPJointHistory, Line 72
The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP, OFFSET or FOR XML is also specified.

+0

嘗試移動'ORDER BY'到外選擇。如果你仔細想想,在內部select中有一個'order by'是沒有意義的,因爲這個包裝不一定遵守接收到的結果集的順序。 – FDavidov

+1

錯誤信息非常清晰。你有什麼難以理解的部分? –

+0

@KenWhite我不知道我該怎麼做 –

回答

0

由於錯誤說,你必須在內部query.Since的ORDER BY你不顯示id我不認爲通過ID訂購它使任何意義。所以,你可以通過刪除訂單和轉換內部查詢到CTE,做這樣的:

;WITH ReportTable 
AS(
    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 
) 


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 ReportTable i)b 
--ORDER BY b.Id DESC 
+0

http://meta.stackexchange.com/q/196187/172661 –

+0

消息207,級別16,狀態1,行67 無效的列名稱'Id'。 –

+0

也許可以考慮在這裏使用CTE,這也會使事情更容易閱讀。 –

相關問題