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