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 @ 2024-03-06 17:27  DawnTraveler  阅读(60)  评论(0)    收藏  举报