SQL語句group by 與order by 執行順序引起的一場「內鬥」

直入主題!看看下面這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 中,應該就能夠解決。固然具體問題具體分析!
相關文章
相關標籤/搜索