2010-10-13 15 views
6

He pegado una versión muy simplificada de mi consulta SQL a continuación. El problema que me estoy encontrando es que la declaración ORDER BY está afectando los resultados de selección de mi CTE. No he podido entender por qué esto es así, mi pensamiento original fue que dentro del CTE, ejecuto alguna declaración SELECT, entonces el ORDER BY debería funcionar en ESOS resultados.SQL CTE y ORDER BY afectando el conjunto de resultados

Lamentablemente, el comportamiento que estoy viendo es que mi declaración interna SELECT se ve afectada por el orden por, dándome 'elementos' que no están en el TOP 10.

Aquí es un ejemplo de los datos: (indexados en orden inverso por ID)

ID, Date 
9600 2010-10-12 
9599 2010-09-08 
9598 2010-08-31 
9597 2010-08-31 
9596 2010-08-30 
9595 2010-08-11 
9594 2010-08-06 
9593 2010-08-05 
9592 2010-08-02 
.... 
9573 2010-08-10 
.... 
8174 2010-08-05 
.... 
38 2029-12-20 

Mi consulta básica:

;with results as(
select TOP 10 ID, Date 
from dbo.items 
) 
SELECT ID 
FROM results 

devuelve la consulta:

ID, Date 
9600 2010-10-12 
9599 2010-09-08 
9598 2010-08-31 
9597 2010-08-31 
9596 2010-08-30 
9595 2010-08-11 
9594 2010-08-06 
9593 2010-08-05 
9592 2010-08-02 

Mi consulta con la consulta ORDER BY

;with results as(
select TOP 10 ID, Date 
from dbo.items 
) 
SELECT ID 
FROM results 
ORDER BY Date DESC 

regresa:

ID, Date 
38 2029-12-20 
9600 2010-10-12 
9599 2010-09-08 
9598 2010-08-31 
9597 2010-08-31 
9596 2010-08-30 
9595 2010-08-11 
9573 2010-08-10 
9594 2010-08-06 
8174 2010-08-05 

¿Alguien puede explicar por qué la primera consulta sólo devolverá los identificadores que están en el top 10 de la tabla, y la segunda consulta devuelve los 10 mejores de toda la tabla (después de aplicar la clasificación).

Respuesta

10

Cuando se utiliza SELECT TOP n que necesidad suministrar un ORDER BY si quieres un comportamiento determinista de lo contrario el servidor es libre de volver cualquier 10 filas que se siente como. El comportamiento que estás viendo es perfectamente válido.

Para resolver el problema, especifique un ORDER BY en el interior del CTE:

WITH results AS 
(
    SELECT TOP 10 ID, Date 
    FROM dbo.items 
    ORDER BY ID DESC 
) 
SELECT ID 
FROM results 
ORDER BY Date 
+0

Supongo que quería que devuelva las 10 filas superiores de la tabla, y luego ordenar las 10 filas superiores, no ordenar toda la tabla y choo se los 10 primeros de ese conjunto ... ¿dónde está mi malentendido? – Brett

+2

@Brett - Necesita decirle a la base de datos a qué se refiere con "las 10 filas superiores de la tabla". Los 10 principales según qué métrica? Tal vez ordenados por fecha? –

+0

Entonces, ¿está diciendo que necesito un pedido dentro del CTE? Entonces: '; con resultados como (SELECCIONAR ID TOP 10, FechaPublicada de artículos ORDER BY ID desc)'? .... ¿Mi confusión surge de por qué un 'ORDER BY' fuera del CTE está afectando los resultados de CTE? – Brett

1

Creo que se puede añadir nueva columna como

SELECT ROW_NUMBER() OVER(ORDER BY <ColumnName>;) AS RowNo 

y entonces todas sus columnas .. Esto le ayudaría a para consultar utilizando el ancla CTE ... usando cláusulas between, where, etc.

+0

esa es la respuesta correcta. – hoanvd1210

Cuestiones relacionadas