2013-08-03 6 views
50

Klauzula ORDER BY jest nieprawidłowa w widoki, funkcje inline, pochodzące tabel, podzapytania i wspólne wyrażeń stole, chyba że TOP, OFFSET lub FOR XML jest również określony.Klauzula ORDER BY jest nieprawidłowa w widoki, funkcje inline, stoły pochodnych, podzapytania, a wspólny stół wyrażenia

Otrzymuję powyższy błąd podczas próby wykonania następującego zapytania. Czy ktokolwiek może mi się przyjrzeć i powiedzieć, co tu robię źle?

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

kolejność powinna być na zewnątrz przez podkwerendzie wybierz jako błąd powiedział – Daniele

Odpowiedz

60

Nie trzeba używać ORDER BY w zapytaniu wewnętrznej po WHERE klauzuli ponieważ już używał go w ROW_NUMBER() OVER (ORDER BY VRDATE DESC).

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

Nie, * nie * użyć ORDER BY do sortowania wierszy w tabeli pochodzącej z powodów podanych w komunikacie o błędzie. Kolejność wierszy w zestawie wyników jest ostatecznie kontrolowana przez klauzulę ORDER BY w zewnętrznej instrukcji SELECT, a nie klauzuli OVER. Klauzula [OVER] (http://technet.microsoft.com/en-us/library/ms189461.aspx) "określa * logiczną * kolejność wykonywania obliczeń funkcji okna". Nie sortuje zestawu wyników. –