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 中,应该就能够解决。固然具体问题具体分析!
相关文章
相关标签/搜索