失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > SQL语句group by 与order by 执行顺序引发的一场“内斗”

SQL语句group by 与order by 执行顺序引发的一场“内斗”

时间:2021-10-26 20:10:54

相关推荐

SQL语句group by 与order by 执行顺序引发的一场“内斗”

直入主题!看看下面这SQL会不会报错?如果报错应该是什么错误!

--说明:黑色字体都是列

SELECTapplication_id,index_num,num,amountFROM`credit_repayment_plan`WHEREstatus = 'unclosed'

GROUP BYapplication_idORDER BYgmt_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`

WHEREstatus = '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 执行顺序引发的一场“内斗”》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。