2010-04-03 2 views
6

Ich versuche, die oberen N Datensätze zu erhalten (wenn sie von einer Spalte X angeordnet sind), aber das Ergebnis wird in umgekehrter Reihenfolge gesetzt. Die folgende Anweisung ist falschen, aber wahrscheinlich demonstriert, was ich nach:Wählen Sie die obersten N Datensätze aus, sortiert nach X, aber haben Ergebnisse in umgekehrter Reihenfolge

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

Zum Beispiel Spalte X eine ID oder ein Zeitstempel sein könnte; Ich möchte die letzten 10 Datensätze, möchte sie aber in chronologischer Reihenfolge zurückgeben.

+1

Warum 'nicht TOP SELECT * FROM 10 FooTable ORDER BY X ASC'? – Dor

+0

@Dor Da würde ich dann die letzten 10 Datensätze bekommen, aber sie würden in umgekehrter chronologischer Reihenfolge zurückgegeben werden. –

Antwort

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

d. H. Sie benötigen möglicherweise einen Alias ​​für Ihre Unterabfrage, aber ansonsten sollte es funktionieren.

+0

Schön, danke. Obwohl ich nicht ganz verstehe, warum SQL einen Alias ​​verlangt, wenn es an keiner anderen Stelle in der Abfrage darauf Bezug nimmt. –

2

Versuchen

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

oder mit einem gemeinsamen Tisch Ausdruck (CTE)

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

SELECT * FROM temp 
ORDER BY X 
1

ORDER BY-Klausel verwendet wird, das Ergebnis mit einer bestimmten Spalte zu bestellen.

Ihre Abfrage Select TOP 10 * from FooTable ORDER BY X DESC vorausgesetzt, X ist der Zeitstempel, wird nicht die zuletzt eingefügten 10 Zeilen zurückgeben. Es gibt die obersten 10 Zeilen als gespeichert (in der Reihenfolge) in der Datenbank zurück und gibt dann die Ergebnismenge der 10 Zeilen in absteigender Reihenfolge zurück. Daher Ihre Unterabfrage sollte

geändert werden

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

Dies sollte Ihre erste Anforderung erfüllen. Sie können diese Ergebnismenge dann als Alias ​​verwenden, um Ihre endgültige Sortierreihenfolge festzulegen.

Ich hoffe, dass ich Sie richtig verstanden habe, wenn Sie sagen „Ich versuche, die Top-N Datensätze zu erhalten (wenn durch eine Spalte X bestellt)

0

Eine alternative Lösung auf diese Frage für alle nicht -unterstützte Versionen für TOP Schlüsselwort ist zu verwenden LIMIT. Beispiel: -

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