2010-04-03 49 views
6

我試圖獲取排名前N的記錄(當按某列X排序時),但結果按相反順序排列。下面的語句是不正確,但可能證明我後:選擇前N個記錄排序X,但有反向排序結果

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

例如,列X可以是一個ID或時間戳;我想要最新的10條記錄,但希望它們按照時間順序返回。

+1

爲什麼不選擇10 *從FooTable ORDER BY X ASC? – Dor 2010-04-03 20:27:07

+0

@Dor因爲然後我會得到最新的10條記錄,但它們會按照倒序的順序返回。 – 2010-04-29 02:26:16

回答

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

即你可能需要在你的子查詢上的別名,但除了它應該工作。

+0

不錯,謝謝。雖然我不明白爲什麼SQL在查詢中沒有引用它時會要求別名。 – 2010-04-03 20:24:48

2

嘗試

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

或具有共同表表達式(CTE)

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

SELECT * FROM temp 
ORDER BY X 
1

ORDER BY子句用於爲了通過指定列的結果集。

您的查詢 Select TOP 10 * from FooTable ORDER BY X DESC假設X是時間戳,不會返回最近插入的10行。它將返回數據庫中存儲的前10行(以任意順序),然​​後按降序返回10個這樣的行的結果集。 因此您的子查詢應該進行修改,以

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

這應該滿足你的第一個要求。然後,您可以使用此結果集作爲別名來決定最終的排序順序。

我希望我理解正確的話,當你說「我試圖讓前N個記錄(當一些列X訂購)

0

另一種解決這個問題的所有非支持版本爲TOP關鍵字是使用LIMIT。 例如: -

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