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 中,应该就可以解决。当然具体问题具体分析!

 

你可能感兴趣的:(SQL语句group by 与order by 执行顺序引发的一场“内斗”)