Estoy usando una aplicación (MapServer - http://mapserver.org/ ) que envuelve las instrucciones SQL, de modo que la instrucción ORDER BY está en la consulta interna. P.ej
SELECT * FROM (
SELECT ID, GEOM, Name
FROM t
ORDER BY Name
) as tbl
La aplicación tiene muchos controladores de bases de datos diferentes. Principalmente uso el controlador MS SQL Server y SQL Server 2008. Esto arroja un error si se encuentra un ORDER BY en una subconsulta.
Desde MS Docs (aunque parece que es para SQL Server 2000, todavía parece aplicarse):
Cuando utiliza una cláusula ORDER BY en una vista, una función en línea, una tabla derivada o una subconsulta, no garantiza la salida ordenada. En cambio, la cláusula ORDER BY solo se usa para garantizar que el conjunto de resultados generado por el operador Top tenga una composición consistente. La cláusula ORDER BY solo garantiza un conjunto de resultados ordenado cuando se especifica en la instrucción SELECT más externa.
Sin embargo, el mismo tipo de consulta cuando se ejecuta en Postgres (9) y Oracle devuelven resultados, con el orden definido en la subconsulta. En Postgres, el plan de consulta muestra que los resultados están ordenados y las notas de la versión de Postgres incluyen el elemento que implica que se utilizan órdenes de subconsulta:
Evite ordenar cuando la subconsulta ORDER BY coincida con la consulta superior
http://en.wikipedia.org/wiki/Order_by dice:
Aunque algunos sistemas de bases de datos permiten la especificación de una cláusula ORDER BY en subselecciones o definiciones de vista, la presencia allí no tiene ningún efecto.
Sin embargo, desde mi propia comprobación de planes de consulta:
- SQL Server 2008 no admite ORDER BY en una subconsulta
- Postgres 9 admite ORDER BY en una subconsulta
- Oracle 10g admite ORDER BY en una subconsulta
Entonces, mi pregunta, ¿hay algún enlace que pueda confirmar o negar oficialmente que Postgres y Oracle no permiten la clasificación en una subconsulta?
fuente
ORDER BY
en la subconsulta como redundante y no realizarían la clasificación innecesaria.Respuestas:
Tendrás que hacer que tu aplicación no ponga el
ORDER BY
interior de la subconsulta (tal vez tenga la opción de no usar una subconsulta innecesaria en primer lugar). Como ya descubrió, esta sintaxis no es compatible con SQL Server sin ellaTOP
. Y conTOP
, a menos que desee dejar algunas filas fuera, el usoTOP 100 PERCENT
va a representar elORDER BY
optimizado de todos modos.Y en Oracle y PostGres, solo porque la sintaxis sea compatible , no significa que se obedezca. Y solo porque lo observe como obedecido en algún escenario, no significa que continuará siendo obedecido a medida que salgan nuevas versiones o con cambios sutiles en sus datos, estadísticas, la consulta o el entorno.
Puedo asegurarle que, sin duda , si desea una garantía sobre el pedido, debe colocar la
ORDER BY
consulta más externa. Esta debería ser una doctrina que mantengas cerca sin importar qué plataforma estés usando.Está solicitando un enlace que declara oficialmente que algo no es compatible. Esto es como buscar en el manual del propietario de su automóvil una declaración oficial de que su automóvil no puede volar.
fuente
Admito que esto es de mala calidad, pero si estás en apuros, intenta devolver el número superior de filas en la subconsulta. Devolver el 100 por ciento superior no funciona, pero si desea pasar por el problema, puede consultar el número de filas y pasarlo a TOP como una variable. Probé esto en una base de datos establecida en el nivel de compatibilidad 80, así que creo que debería funcionar con SQL 2000.
fuente
Name
no es única. Es posible que no continúe funcionando en serie si el optimizador elige un índice diferente, con un orden de columna de clave diferente.