2009-08-20 20 views
11

tenemos una vista en nuestra base de datos que tiene un ORDER BY en ella. Ahora, me doy cuenta de que las vistas generalmente no ordenan, porque diferentes personas pueden usarlo para diferentes cosas, y quieren que se ordene de manera diferente. Sin embargo, esta vista se utiliza para un caso de uso MUY ESPECÍFICO que exige un cierto orden. (Es una clasificación de equipo para una liga de fútbol).ORDER BY en una vista Sql Server 2008

La base de datos es Sql Server 2008 Express, v.10.0.1763.0 en un cuadro de Windows Server 2003 R2.

La vista se define como tal:

CREATE VIEW season.CurrentStandingsOrdered 
AS 
    SELECT TOP 100 PERCENT *, season.GetRanking(TEAMID) RANKING 
    FROM season.CurrentStandings 
    ORDER BY 
     GENDER, TEAMYEAR, CODE, POINTS DESC, 
     FORFEITS, GOALS_AGAINST, GOALS_FOR DESC, 
     DIFFERENTIAL, RANKING 

Devuelve:

GENDER, TEAMYEAR, CODE, TEAMID, CLUB, NAME, 
WINS, LOSSES, TIES, GOALS_FOR, GOALS_AGAINST, 
DIFFERENTIAL, POINTS, FORFEITS, RANKING 

Ahora, cuando corro un SELECT contra de la opinión, ordena los resultados por GÉNERO, TEAMYEAR , CODE, TEAMID. Observe que está ordenando por TEAMID en lugar de PUNTOS como especifica la cláusula order by.

Sin embargo, si copio la instrucción SQL y ejecutarlo exactamente como está en una nueva ventana de consulta, ordena correctamente según lo especificado por el ORDER BY cláusula.

Respuesta

19

El orden de las filas devuelto por una vista con una cláusula ORDER BY nunca está garantizado. Si necesita un pedido de fila específico, debe especificar dónde selecciona desde la vista.

Consulte esta nota en la parte superior de this Book On-Line entrada.

+0

¡Eso es molesto! Puedo ver/entender un poco no garantizándolo en una VISTA, tipo de ... pero al menos debería funcionar en una función con valores de tabla. GRRR. Gracias por la respuesta de todos modos. :) – eidylon

19

SQL Server 2005 ignora el TOP 100 PERCENT por diseño.

Pruebe TOP 2000000000 en su lugar.

Ahora, voy a tratar de encontrar una referencia ... yo estaba en un seminario presentado por Itzak Ben-Gan quien mencionó que

encontrado algunas ...

Kimberly L. Tripp

"TOP 100 Percent ORDER BY Considered Harmful"

En este caso particular, el optimizador reconoce que TOP 100 PORCENTAJE califica todas las filas y no necesita para ser calculado en absoluto.

+0

Tengo curiosidad acerca de esta revisión de SQL Server Me tropecé a través de: http://support.microsoft.com/kb/926292: Si estoy leyendo correctamente, entonces la revisión 'arregla' el comportamiento para ordenar? –

+0

@MitchWheat: sí, parece familiar.Creo que significa que el TOP interior ... ORDEN POR fubars el ORDEN externo POR – gbn

+0

No estoy seguro de que lo haga. Parece decir que la aplicación de la revisión garantizará que ORDER BY en las vistas siempre funcione (lo que obviamente contradice el artículo de MSDN (¡y posiblemente buen sentido!)) –

2

ejecuta un seguimiento de perfiles en la base de datos y ver la consulta que es en realidad que se ejecuta cuando se consulta la vista.

También es posible que desee considerar el uso de un procedimiento almacenado para devolver los datos de su vista, ordenados correctamente para su caso de uso específico.

+0

Yah, realmente estaba buscando algo directamente cuestionable ... ver, función de valor de tabla, que no es un sproc. – eidylon

4

sólo tiene que utilizar:

"superior (99) por ciento"

o

"Top (un número 1000s veces más que sus filas de datos como 24682468123)" funciona! solo inténtalo.

4

En SQL Server 2008, ORDER BY se ignora en las vistas que utilizan TOP 100 PERCENT. En versiones anteriores de SQL Server, ORDER BY solo se permitía si se usaba TOP 100 PERCENT, pero nunca se garantizó una orden perfecta. Sin embargo, muchos asumieron que una orden perfecta estaba garantizada. Debo inferir que Microsoft no quiere engañar a los programadores y DBA para que crean que hay un orden garantizado usando esta técnica.

una excelente demostración comparativa de esta inexactitud, se puede encontrar aquí ...

http://blog.sqlauthority.com/2009/11/24/sql-server-interesting-observation-top-100-percent-and-order-by

Vaya, me he dado cuenta de que esto ya fue respondida. Pero vale la pena echar un vistazo a la demostración comparativa de todos modos.

2

He encontrado una solución alternativa.

Mi plan inicial era crear una columna 'ordenar por orden' que impidiera a los usuarios tener que realizar un tipo complejo.

Utilicé una función de ventana ROW_NUMBER. En la cláusula ORDER BY, especifiqué el orden de clasificación predeterminado que necesitaba (tal como lo hubiera estado en el ORDER BY de una instrucción SELECT).

puedo obtener varios resultados positivos:

  1. Por defecto, los datos se está devuelto en el orden predeterminado que pretendía originalmente (esto es probablemente debido a la función de ventana tener que ordenar los datos antes de la asignación el valor sort_order)

  2. Otros usuarios pueden ordenar los datos en formas alternativas si deciden

  3. la columna sort_order está ahí por una necesidad de tipo muy específico, por lo que es más fácil fo Los usuarios deben ordenar los datos, cualquiera que sea la herramienta que utilicen, reorganiza el conjunto de filas.

Nota: En mi aplicación específica, los usuarios están accediendo a la vista a través de Excel 2010, y por defecto los datos se presentan al usuario como yo esperaba, sin ordenación adicional necesario.

Espero que esto ayude a aquellos con un problema similar.

Saludos, Ryan

Cuestiones relacionadas