直入主题!看看下面这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 中,应该就能够解决。固然具体问题具体分析!