Last Updated: February 25, 2016
·
700
· vitochung

SQL語法執行順序

先說結論,SQL語法有執行順序,有時候我們看起來沒問題的SQL,在編譯的時候可能會產生不一樣的結果,請參考下列網址

http://msdn.microsoft.com/zh-tw/library/ms189499.aspx

我下面舉的是ORACLE 8i的例子 (也許新版沒這問題),
跟最近遇到的情況有點類似,參考一下

如果我們想對某個table抓出前3筆資料

在MS-SQL的語法是

SELECT TOP 3 * FROM [TABLE]

在ORACLE的語法是

SELECT * FROM [TABLE] WHERE ROWNUM between 1 and 3

如果我們想對某個table先排序之後再抓出前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