直入主題!看看下面這SQL會不會報錯?若是報錯應該是什麼錯誤!數據庫
--說明:黑色字體都是列
SELECT application_id, index_num, num, amount FROM `credit_repayment_plan` WHERE status = 'unclosed'
GROUP BY application_id ORDER BY gmt_create ;
MySQL下應該沒啥問題,比較智能!oracle
可是針對於oracle 數據庫居然報錯:group by 表達式出錯!app
這就比較尷尬了,公司封裝的組件怎麼可能會有這樣的狀況存在呢?函數
因而按照SQL執行順序進行解讀:字體
(1)from
(2) join
(3) on
(4) where
(5)group by
(6) avg,sum.... (組函數)
(7)having
(8) select
(9) distinct
(10) order by spa
好的!按照咱們這裏的順序進行對應:code
FROM `credit_repayment_plan`
WHERE status = 'unclosed'
GROUP BY num
SELECT application_id, num, amount, index_num
ORDER BY gmt_create ;
這裏就找到問題了:這個時候的order by 拍排序,實際上是針對select查詢出來的臨時表進行排序的,那麼臨時表中並無 blog
gmt_create 字段,因此會報錯!
然而,報錯倒是 group by 表達式出錯;
這個問題一直也是比較解決的,爲啥會有這樣的一個問題!
猜測一:應該是在進行order by 的時候,判斷了這個列是一個數據庫應該存在的列,而臨時表不存在,select 的字段只能來自函數的計算 或者 group by 的分組字段。因此認定爲group by 沒有查詢該字段致使的查詢的臨時表結果中沒有對應的列,從而order by 就會出錯。歸根於group by 的問題!
猜測二:當前SQL的有效操做關鍵字優先級較高的就是group by,因此定位是group by 的問題。
固然以上都是猜測,具體怎麼回事,還未知。等往後請教別人以後再評論區補充。
總結:針對於oracle 數據庫,使用group by 以及 order by 的時候,若是order by 使用的排序字段再select 中沒有查詢,那麼可能報錯的內容是group by表達式錯誤! 到時候須要講order by 的對應列防盜select 中,應該就能夠解決。固然具體問題具體分析!