我試圖獲取排名前N的記錄(當按某列X排序時),但結果按相反順序排列。下面的語句是不正確,但可能證明我後:選擇前N個記錄排序X,但有反向排序結果
SELECT * FROM (SELECT TOP 10 * FROM FooTable ORDER BY X DESC) ORDER BY X ASC
例如,列X可以是一個ID或時間戳;我想要最新的10條記錄,但希望它們按照時間順序返回。
我試圖獲取排名前N的記錄(當按某列X排序時),但結果按相反順序排列。下面的語句是不正確,但可能證明我後:選擇前N個記錄排序X,但有反向排序結果
SELECT * FROM (SELECT TOP 10 * FROM FooTable ORDER BY X DESC) ORDER BY X ASC
例如,列X可以是一個ID或時間戳;我想要最新的10條記錄,但希望它們按照時間順序返回。
SELECT * FROM
(SELECT TOP 10 * FROM FooTable ORDER BY X DESC) as myAlias
ORDER BY X ASC
即你可能需要在你的子查詢上的別名,但除了它應該工作。
不錯,謝謝。雖然我不明白爲什麼SQL在查詢中沒有引用它時會要求別名。 – 2010-04-03 20:24:48
嘗試
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
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訂購)」
另一種解決這個問題的所有非支持版本爲TOP關鍵字是使用LIMIT。 例如: -
SELECT * FROM
(SELECT * FROM FooTable ORDER BY X DESC LIMIT 10) as myAlias
ORDER BY X ASC
爲什麼不選擇10 *從FooTable ORDER BY X ASC? – Dor 2010-04-03 20:27:07
@Dor因爲然後我會得到最新的10條記錄,但它們會按照倒序的順序返回。 – 2010-04-29 02:26:16