2012-09-21 11 views
13

Quiero invertir el orden en el servidor SQL de resultados después de usar desc. Por ejemplo:sql orden inverso del servidor después de usar desc

SELECT TOP 3 * FROM table ORDER BY id DESC 

devuelve resultados:

505 
504 
503 

Pero entonces yo quiero voltear los resultados a este aspecto:

503 
504 
505 

Probé

SELECT * FROM (SELECT TOP 3 * FROM table ORDER BY id DESC) ORDER BY id ASC 

pero eso no funcionó, alguna sugerencia?

+12

Cuando dices "no funcionó", * ¿cómo? ¿No funcionó? ¿Te dio diferentes resultados? ¿Le dio los mismos resultados (orden incorrecta)? ¿El servidor explotó? ¿Las rapaces invadieron tu oficina? –

+0

¿En qué versión de SQL Server estás? –

Respuesta

20

Eso debería funcionar siempre que alias la subconsulta.

SELECT q.* 
    FROM (SELECT TOP 3 * 
       FROM table 
       ORDER BY id DESC) q 
    ORDER BY q.id ASC 
2

SELECT * FROM (SELECT TOP 3 * FROM table ORDER BY id DESC) As AliasName ORDER BY id ASC

1
SELECT * FROM (SELECT TOP 3 * FROM table ORDER BY id DESC) AS r ORDER BY r.id ASC 

descubierto necesario para hacer tabla temporal tiene un nombre utilizando AS

2
;WITH cte 
AS 
(
    SELECT *, ROW_NUMBER() OVER(ORDER BY id DESC) rank 
    FROM table 
) 
SELECT * 
FROM cte 
WHERE rank <= 3 
ORDER BY id ASC 
+0

Solo una pregunta. ¿Este CTE no seleccionará toda la tabla y solo cuando selecciones el exterior filtrará las filas que deseas? ¿No es esto potencialmente costoso para mesas grandes? Tal vez, estoy equivocado y el CTE no se ejecuta hasta que se ejecuta la selección externa, un poco como la ejecución diferida. –

+1

@SachinKainth - Ningún SQL Server agregará un 'TOP' al plan de todos modos. Sin embargo, esto debería tener 'ORDER BY id ASC' como el orden final. –

4

Creo que se le olvidó el alias subselección

SELECT * 
FROM (
    SELECT TOP 3 * 
    FROM table 
    ORDER BY id DESC 
) s 
ORDER BY id ASC 
0
SELECT * 
FROM (
    SELECT * 
    FROM table 
    ORDER BY ID DESC 
) TMP 
ORDER BY TMP.ID ASC