Korzystam z aplikacji (MapServer - http://mapserver.org/ ), która otacza instrukcje SQL, dzięki czemu instrukcja ORDER BY znajduje się w wewnętrznym zapytaniu. Na przykład
SELECT * FROM (
SELECT ID, GEOM, Name
FROM t
ORDER BY Name
) as tbl
Aplikacja ma wiele różnych sterowników baz danych. Używam głównie sterownika MS SQL Server i SQL Server 2008. Zgłasza to błąd, jeśli w podzapytaniu zostanie znalezione polecenie ORDER BY.
Z MS Docs (choć dotyczy to SQL Server 2000, nadal wydaje się, że ma zastosowanie):
Kiedy używasz klauzuli ORDER BY w widoku, funkcji wbudowanej, tabeli pochodnej lub podzapytaniu, nie gwarantuje to uporządkowanego wyniku. Zamiast tego klauzula ORDER BY służy jedynie do zagwarantowania, że zestaw wyników generowany przez górny operator ma spójny skład. Klauzula ORDER BY gwarantuje uporządkowany zestaw wyników tylko wtedy, gdy jest określony w najbardziej zewnętrznej instrukcji SELECT.
Jednak ten sam typ zapytania uruchamiany w Postgres (9) i Oracle zwraca wyniki - z kolejnością zdefiniowaną w podzapytaniu. W Postgres plan zapytań pokazuje, że wyniki są posortowane, a informacje o wydaniu Postgres zawierają element, który sugeruje, że używane są zamówienia na zapytania częściowe:
Unikaj sortowania, gdy podzapytanie ORDER BY pasuje do górnego zapytania
http://en.wikipedia.org/wiki/Order_by stwierdza:
Chociaż niektóre systemy baz danych zezwalają na określenie klauzuli ORDER BY w podselekcjach lub definicjach widoków, obecność nie ma żadnego efektu.
Jednak z własnego sprawdzenia planów zapytań:
- SQL Server 2008 nie obsługuje ORDER BY w podzapytaniu
- Postgres 9 obsługuje ORDER BY w podzapytaniu
- Oracle 10g obsługuje ORDER BY w podzapytaniu
Więc moje pytanie: czy są jakieś linki, które mogą oficjalnie potwierdzić lub zaprzeczyć, że Postgres i Oracle nie pozwalają na sortowanie w podzapytaniu?
ORDER BY
podzapytanie jako nadmiarowe i nie dokonywałyby niepotrzebnego sortowania.