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 表达式出错!

问题分析

按照MySql官网提供的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 字段,所以语句必然会报错!
我们上面已经说过,上一个操作命令执行之后产生的临时表被用于下一个执行命令,所以这个地方order by执行的时候,因为select的语句中没有orderby的目标字段,select 的字段只能来自函数的计算 或者 group by 的分组字段。所以认定为group by 没有查询该字段导致的查询的临时表结果中没有对应的列,从而order by 就会出错。归根于group by 的问题!

解决

在select中增加order by的排序列。

总结

针对于oracle 数据库,使用group by  以及 order by 的时候,如果order by 使用的排序字段再select 中没有查询,那么可能报错的内容是group by表达式错误! 到时候需要讲order by 的对应列放到select 的查询列中,应该就可以解决。

 

posted @ 2018-04-23 16:37  白壮丽  阅读(23446)  评论(0编辑  收藏  举报