先 說 結論, SQL 語法 有 執行 順序, 有時候 我們 看起來 沒 問題 的 SQL, 在 編譯 的 時候 可能 會 產生 不 一樣 的 結果, 請 參考 下列 網址
http://msdn.microsoft.com/zh-tw/ library / ms189499.aspx
我 下面 舉 的 是 ORACLE 8i 的 例子 (也許 新版 沒 這 問題),
跟 最近 遇到 的 情況 有點 類似, 參考.
我們 想 對 某個 tabela 抓 出 前 3 筆 資料
在 MS-SQL 的 語法 是
SELECT TOP 3 * FROM [TABLE]
在 ORACLE 的 語法.
SELECT * FROM [TABLE] WHERE ROWNUM between 1 and 3
如果 我們 想 對 某個 tabela 先 排序 之後 再 抓 出 前 3 筆 資料
在 MS-SQL 的 語法 是
SELECT TOP 3 * FROM [TABLE] ORDER BY [FIELD]
在 ORACLE 的 語法 是
SELECT ** FROM [TABLE] WHERE ROWNUM between 1 and 3 ORDER BY [FIELD]
(這 結果 不是 想要 的 的)
但是 , 上述 兩個 語法 的 執行 結果 其實 不 一樣
MS-SQL 是 先 排序, 再 抓 前 3 筆
ORACLE 是 先 抓 前 3 筆, 再.
所以 ORACLE 想 做到 和 SQL 相同 效果, 要用 巢 狀 SQL
SELECT ** FROM ( SELECT * FROM [TABLE] ORDER BY [FIELD] ) A WHERE ROWNUM between 1 and 3