直入主題!看看下面這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 數據庫竟然報錯:group by 表達式出錯!
這就比較尷尬了,公司封裝的組件怎么可能會有這樣的情況存在呢?
於是按照SQL執行順序進行解讀:
(1)from
(2) join
(3) on
(4) where
(5)group by
(6) avg,sum.... (組函數)
(7)having
(8) select
(9) distinct
(10) order by
好的!按照我們這里的順序進行對應:
FROM `credit_repayment_plan`
WHERE status = 'unclosed'
GROUP BY num
SELECT application_id, num, amount, index_num
ORDER BY gmt_create ;
這里就找到問題了:這個時候的order by 拍排序,其實是針對select查詢出來的臨時表進行排序的,那么臨時表中並沒有
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 中,應該就可以解決。當然具體問題具體分析!