2013-08-03 3 views
50

ungültig Die ORDER BY-Klausel ist in Sichten, Inline-Funktionen, abgeleiteten Tabellen, Unterabfragen und allgemeinen Tabellenausdrücken ungültig, es sei denn TOP, OFFSET oder FOR XML wird ebenfalls angegeben.Die ORDER BY-Klausel ist in Sichten, Inline-Funktionen, abgeleiteten Tabellen, Unterabfragen und allgemeinen Tabellenausdrücken

Ich bekomme den oben genannten Fehler beim Versuch, die folgende Abfrage auszuführen. Kann mir bitte jemand mal ansehen und mir sagen was mache ich hier falsch?

SELECT 
    * 
FROM (
    SELECT 
     Stockmain.VRNOA, 
     item.description as item_description, 
     party.name as party_name, 
     stockmain.vrdate, 
     stockdetail.qty, 
     stockdetail.rate, 
     stockdetail.amount, 
     ROW_NUMBER() OVER (ORDER BY VRDATE) AS RowNum 
    FROM StockMain 
    INNER JOIN StockDetail 
     ON StockMain.stid = StockDetail.stid 
    INNER JOIN party 
     ON party.party_id = stockmain.party_id 
    INNER JOIN item 
     ON item.item_id = stockdetail.item_id 
    WHERE stockmain.etype='purchase' 
    ORDER BY VRDATE DESC 
) AS MyDerivedTable 
WHERE 
    MyDerivedTable.RowNum BETWEEN 1 and 5 
+0

die Reihenfolge von außerhalb der Unterabfrage wählen Sie als Fehler sein sollte, sagte – Daniele

Antwort

60

Sie brauchen nicht ORDER BY in innere Abfrage nach WHERE Klausel zu verwenden, da Sie es bereits in ROW_NUMBER() OVER (ORDER BY VRDATE DESC) verwendet haben.

SELECT 
    * 
FROM (
    SELECT 
     Stockmain.VRNOA, 
     item.description as item_description, 
     party.name as party_name, 
     stockmain.vrdate, 
     stockdetail.qty, 
     stockdetail.rate, 
     stockdetail.amount, 
     ROW_NUMBER() OVER (ORDER BY VRDATE DESC) AS RowNum --< ORDER BY 
    FROM StockMain 
    INNER JOIN StockDetail 
     ON StockMain.stid = StockDetail.stid 
    INNER JOIN party 
     ON party.party_id = stockmain.party_id 
    INNER JOIN item 
     ON item.item_id = stockdetail.item_id 
    WHERE stockmain.etype='purchase' 
) AS MyDerivedTable 
WHERE 
    MyDerivedTable.RowNum BETWEEN 1 and 5 
+15

Nein, du * nicht * ORDER BY verwenden, um Zeilen in der abgeleiteten Tabelle aus dem Grunde in der Fehlermeldung gegeben zu sortieren. Die Reihenfolge der Zeilen in der Ergebnismenge wird letztlich durch eine ORDER BY-Klausel in der äußeren SELECT-Klausel und nicht durch die OVER-Klausel gesteuert. Die [OVER-Klausel] (http://technet.microsoft.com/en-us/library/ms189461.aspx) "gibt die * logische * Reihenfolge an, in der die Berechnung der Fensterfunktion ausgeführt wird". Es sortiert die Ergebnismenge nicht. –

Verwandte Themen