¿Cuáles son las alternativas para una cláusula ORDER BY en una vista?


12

Esta pregunta solo tenía que estar en este sitio :)

ORDER BY tiene prohibido su uso en una vista, como entendí debido a la posibilidad de múltiples órdenes by al usar esta vista.

Sé que hay formas de eludir esta limitación, por ejemplo TOP 99.999999 PERCENT, pero me gustaría saber cuál es la mejor práctica, no cómo hackearla.

Entonces, si quiero crear vistas en mi base de datos para uso personal, lo que significa que quiero conectarme a la base de datos y solo ver los datos arreglados y ordenados, ¿cómo debo hacerlo si no puedo ordenar una vista?

Actualmente en mi SQL Server DB tengo vistas con el TOPhack, y las estoy usando mucho, pero se siente mal.


1
¿Por qué no TOP 100%?
garik

@garik, porque todavía no garantiza el pedido si entiendo el enlace de gbn correctamente. Es sólo una respuesta equivocada más concisa
Jack dice tratar topanswers.xyz

1
@Jack Douglas no fue una respuesta, fue un comentario sobre los mejores 99.999 ...
garik

@garik: en SQL Server 2008, se ignora el 100 POR CIENTO SUPERIOR y solo funciona 99. Creo que se solucionó pero mi versión no está actualizada.
yellowblood

1
Esto no es una limitación técnica. Esto es por diseño. Es por eso que cualquier solución alternativa se siente como un truco. Imponga su pedido en las consultas contra las vistas. Una orden se aplica a un conjunto de resultados (salida de consulta e.ge), no a una recopilación de datos (por ejemplo, una vista o tabla).
Nick Chammas

Respuestas:


2

No existe una vista "ordenada" porque se supone que una vista es un conjunto de filas. Use un procedimiento almacenado si desea un pedido fijo.


Esta es la respuesta que explica por qué no puede imponer un orden dentro de una definición de vista. Un conjunto, por definición, no tiene un orden. Sin embargo, cuando se combina TOPcon ORDER BY, ahora está definiendo un nuevo conjunto ya que el orden afecta qué filas son "superiores"; Es por eso TOPque le permite usar ORDER BYen una definición de vista.
Nick Chammas

9

Solo el ORDER BY externo garantizará el pedido

  • Se ignora cualquier ORDER BY intermedio o interno.
    Esto incluye ORDER BY en una vista
  • No hay un orden implícito en ninguna tabla.
  • No hay un orden implícito de ningún índice (agrupado o no) en esa tabla

Enlaces

ORDER BY garantiza un resultado ordenado solo para la instrucción SELECT más externa de una consulta. Por ejemplo, considere la siguiente definición de vista: (y siga un ejemplo que coincida con esta pregunta)


Gracias por la aclaración, pero no es la respuesta que estaba buscando :) Estoy tratando de ver qué tipo de alternativas hay para el conveniente ORDER BY dentro de una vista.
yellowblood

3

Agregue un ORDER BY a la salida de la vista, es decir

  SELECT whatever FROM MYVIEW ORDER BY whatever

1
No hay un orden implícito por índice agrupado. -1.
gbn

@SqlACID - buena edición, +1 en lugar de -1 :)
Jack dice que intente topanswers.xyz

Esto significa que debe reescribir el orden por cláusula cada vez que consulta la vista, que es lo que estamos tratando de evitar cuando usamos el orden dentro de la vista.
yellowblood

como dportas dijo, un contenedor de proceso almacenado alrededor de la consulta funcionaría, pero probablemente no sea lo que está buscando.
SqlACID

Realmente intenté el procedimiento almacenado, pero no fue fácil y rápido consultar o manipular. Meh
yellowblood
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.