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 數據庫竟然報錯: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 中,應該就可以解決。當然具體問題具體分析!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM