Я використовую додаток (MapServer - http://mapserver.org/ ), який обгортає оператори SQL, щоб оператор ORDER BY знаходився у внутрішньому запиті. Напр
SELECT * FROM (
SELECT ID, GEOM, Name
FROM t
ORDER BY Name
) as tbl
У додатку є багато різних драйверів баз даних. В основному я використовую драйвер MS SQL Server і SQL Server 2008. Це призводить до помилки, якщо ORDER BY знайдено в підзапиті.
З MS Docs (хоча це для SQL Server 2000, він все ще здається):
Якщо ви використовуєте пункт ORDER BY у представленні, вбудованій функції, похідній таблиці або підзапиті, це не гарантує впорядкований вихід. Замість цього пункт ORDER BY використовується лише для того, щоб гарантувати, що набір результатів, що генерується оператором Top, має послідовну структуру. Пункт ORDER BY гарантує лише упорядкований набір результатів лише тоді, коли він визначений у самій зовнішній операторі SELECT.
Однак однотипний запит при запуску в Postgres (9) та результатах повернення Oracle - з порядком, визначеним у підзапиті. У Postgres план запитів показує результати сортування, а примітки до випуску Postgres містять елемент, який передбачає, що використовуються замовлення підзапитів:
Уникайте сортування, коли підзапит "ЗАМОВЛЕННЯ ПО" відповідає верхньому запиту
http://en.wikipedia.org/wiki/Order_by заявляє:
Хоча деякі системи баз даних дозволяють конкретизувати пункт ORDER BY у підселектах або переглядати визначення, наявність там не впливає.
Однак з моєї власної перевірки планів запитів:
- SQL Server 2008 не підтримує ORDER BY у підзапиті
- Postgres 9 підтримує ORDER BY в підзапиті
- Oracle 10g підтримує ORDER BY у підзапиті
Отже, на моє запитання, чи є посилання, які можуть офіційно підтвердити або спростувати, що Postgres і Oracle не дозволяють сортувати в підзапиті?
ORDER BY
підзапит як зайвий, а не зайве сортування.