Mysql和Oracle在order by上关于聚合函数一些不同的差异

1.问题

SELECT p.PDTNO, p.PDTNAME, sum(a.QUANTITY) AS applySumCount
FROM PRODUCT p 
JOIN APPLY a ON p.PDTNO = a.PDTNO 
GROUP BY PDTNO 
ORDER BY applySumCount DESC;

在Mysql中我们经常将select中聚合函数得到的结果起别名用于order by.
甚至直接使用表达式也是可以的!

SELECT p.PDTNO, p.PDTNAME, sum(a.QUANTITY) AS applySumCount
FROM PRODUCT p 
JOIN APPLY a ON p.PDTNO = a.PDTNO 
GROUP BY PDTNO 
ORDER BY sum(a.QUANTITY) DESC;

但是同样的方式在Oracle中就不行,会报错:ORA-00918: 未明确定义列

2.解决

参考: 聚合函数是否可以写在order by后面,为什么?
在Group by/Order by/Where/ON子句中不能使用....

SQL查询通常按照以下顺序执行:
FROM(指定表或数据源)-> WHERE(筛选条件)-> GROUP BY(分组)-> HAVING(分组后的筛选条件)-> SELECT(选择列和计算聚合函数)-> ORDER BY(排序)。
这个顺序是按照逻辑流程来执行的。聚合函数在SELECT子句中执行,而ORDER BY子句在整个查询的最后执行,以便对最终结果进行排序。

MySQL和Oracle在处理聚合函数在ORDER BY子句中的行为上存在一些差异。

在MySQL中,允许在ORDER BY子句中直接引用聚合函数的结果。这意味着你可以像你的查询那样直接使用applySumCount来排序结果。
而在Oracle中,ORDER BY子句不能直接引用聚合函数的结果。需要在这些子句中使用聚合函教的结果,可以使用子查询来解决

SELECT subquery.PDTNO, subquery.PDTNAME, subquery.applySumCount
FROM (
    SELECT p.PDTNO, p.PDTNAME, SUM(a.QUANTITY) AS applySumCount
    FROM PRODUCT p 
    JOIN APPLY a ON p.PDTNO = a.PDTNO 
    GROUP BY p.PDTNO, p.PDTNAME
) subquery
ORDER BY subquery.applySumCount DESC;
posted @   DawnTraveler  阅读(44)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示