今日天氣多雲轉晴,應近期甲方需求的變動,需要我扛上SQL,親自上手優化一個系統中一年前開發的一個功能。
首先:我了解了要優化的功能
其次:我看了之前寫的代碼(包括SQL)
最后:在我明白了我要怎么做的情況下,我的右手從鼠標瞬間移到了左手所在的十五寸筆記本電腦的鍵盤上,我的雙手在我大腦的驅使下開始肆虐鍵盤,
兩分鍾過后,everything is OK;
好,打開web頁面開始運行。萬萬沒想到,報錯了。點開日志,開始看,過了兩秒鍾,我的眼神死死的鎖在了那一行報錯的日志上,我清清楚楚的看了sqlException,
我把報錯的SQL放到pl/sql developer中,按下了F8,果然,報錯了。這時我回想我剛剛做了什么騷操作,一秒之后,我想起來了,只是加了一個union和union后面
的一個查詢罷了,試着去掉剛剛加的SQL代碼,哎,沒問題啊,加上,哎,又有問題了。
后來發現,居然union前面有一個order by在作祟,很久以前遇到過這樣類似的問題,可現在卻早已忘記,真是應了那句“用進廢退”的生物進化理論,所以今天我
將它寫在這里,給自己記個筆記,也希望能幫助到遇到類似問題的朋友;
通常在oracle中出現 select·········· +++········ order by 這樣的語句的時候說明當前這條select 語句的結束,而且一個select語句中只允許出現一個order by語句,而且order by必須位於整個select語句的最后。也就是說你要在它后面加東西,除了select·········· +++········ order by;這樣,加一個分號“;”(分號意味着整句SQL的結束),如果加其他的,就是違反了它的一個規則,
當我這樣寫:
select ····· from table where ····· order by union select········from table where ·····
或者這樣寫
select ····· from table where ······· order by union all selec t····· from table where ·····
就會報錯
所以我們在寫法上面略施技巧即可決絕此類問題的出現,解決方法如下:
select ··· from(select ··· from table where ···· order by ) union select ······ (select ··· from table where ·····) //union也可為union all
select ··· from(select ··· from table where ···· union select ··· from table where ·····) order by //union也可為union all
OK,這個小問題已解決,
天氣轉晴了