2010-04-03 2 views
6

Sto cercando di ottenere i primi record N (quando ordinato da qualche colonna X), ma il risultato è impostato in ordine inverso. La seguente dichiarazione è corretta, ma probabilmente dimostra quello che sto cercando:Selezionare i primi N record ordinati da X, ma avere risultati in ordine inverso

SELECT * FROM (SELECT TOP 10 * FROM FooTable ORDER BY X DESC) ORDER BY X ASC 

Ad esempio, la colonna X potrebbe essere un ID o un timestamp; Voglio gli ultimi 10 record ma voglio che vengano restituiti in ordine cronologico.

+1

Perchè non 'SELEZIONARE TOP 10 * DA FooTable ORDER BY X ASC'? – Dor

+0

@Dor Perché quindi vorrei ottenere gli ultimi 10 record, ma sarebbero stati restituiti in ordine cronologico inverso. –

risposta

9
SELECT * FROM 
    (SELECT TOP 10 * FROM FooTable ORDER BY X DESC) as myAlias 
ORDER BY X ASC 

Ad esempio, potrebbe essere necessario un alias nella sottoquery, ma a parte questo dovrebbe funzionare.

+0

Bello, grazie. Anche se non capisco perché SQL richiede un alias quando non ci sono riferimenti ad esso altrove nella query. –

2

Prova

SELECT * FROM 
(SELECT TOP 10 * FROM FooTable ORDER BY X DESC) temp --alias 
ORDER BY X 

o con un'espressione di tabella comune (CTE)

WITH Temp AS (SELECT TOP 10 * FROM FooTable ORDER BY X DESC) 

SELECT * FROM temp 
ORDER BY X 
1

ORDER BY viene utilizzata per ordinare l'insieme di risultati da una colonna specificata.

La vostra domanda Select TOP 10 * from FooTable ORDER BY X DESC presupponendo che X sia il timestamp, non restituirà le 10 righe inserite più di recente. Restituirà le prime 10 righe come memorizzate (in qualsiasi ordine) nel Database e restituirà quindi il set di risultati delle 10 di tali righe, in ordine decrescente. Quindi il tuo sottoquery dovrebbe essere modificato per

Select TOP 10 * from (Select * from FooTable ORDER BY DESC) as T

Questo dovrebbe soddisfare il vostro primo requisito. Puoi quindi utilizzare questo set di risultati come alias per decidere il tuo ordinamento finale.

Spero di ben capito, quando si dice "Sto cercando di ottenere i migliori record N (quando ordinato da un po 'di colonna X)"

0

Una soluzione alternativa a questa domanda per tutti i non -le versioni supportate per la parola chiave TOP è LIMIT. Esempio: -

SELECT * FROM 
    (SELECT * FROM FooTable ORDER BY X DESC LIMIT 10) as myAlias 
ORDER BY X ASC