2017-08-16 54 views
-8

のために私はこのエラーを取得しています、ビュー、インライン関数、派生テーブル、サブクエリ、および共通テーブル式では無効です。 :ORDER BY句はTOP場合を除き、OFFSETまたは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

派生テーブルで注文しました... – Leonidas199x

+6

エラーメッセージはかなり明確です。 – HoneyBadger

+1

なぜこの「ORDER BY」が必要ですか? – sagi

答えて

2

リレーショナルモデルでは、リレーションのタプルに特定の順序がないことが指定されています。つまり、データベース表の行には特定の順序はありません。 そのため、テーブルとして参照できるもの(ビュー、派生テーブルなど)を作成するときには、order by句を指定することはできません。ただし、結果の限定に必要な場合以外はtopまたはoffsetです。
for xml句にorder by句を使用できます。これは、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 
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が指摘した正解は、その注文句を取り除くことです。

+1

他のテーブルと同様に、一時テーブルにレコードを挿入しても効果はありません。 –

関連する問題