Я использую приложение (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 включают элемент, который подразумевает использование заказов подзапроса:
Избегайте сортировки, когда подзапрос ORDER BY соответствует верхнему запросу
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
в подзапросе как избыточный и не выполняют ненужную сортировку.