Mik*_*ike 1 mysql database oracle
任何人都可以解释Oracle的局限性,因为以下语句在MySQL中有效,但在Oracle中收到"不是GROUP BY表达式"?
SELECT order1.user_id,
order1.order_datetime,
SUM(order2.order_total)
FROM order_table order1
JOIN order_table order2 ON order1.user_id = order2.user_id
GROUP BY order1.user_id
Run Code Online (Sandbox Code Playgroud)
是因为Oracle不知道如何处理该order_datetime列?它不能像从GROUP BY order1.user_idMySQL中那样从行中接收到哪一行返回列结果吗?
编辑:
我知道所有列都应该在组中,但是我试图理解为什么Oracle不会像MySQL那样返回类似的结果(而MySQL不需要每个GROUP BY,而Oracle也需要).
Tar*_*ryn 12
Oracle实际上正在执行正确的行为.使用GROUP BY时,选择列表中的项目必须出现在GROUP BY聚合函数中或聚合函数中.
SELECT order1.user_id,
order1.order_datetime,
SUM(order2.order_total)
FROM order_table order1
JOIN order_table order2 ON order1.user_id = order2.user_id
GROUP BY order1.user_id, order1.order_datetime
Run Code Online (Sandbox Code Playgroud)
MySQL使用a EXTENSION TO GROUP BY允许不强制执行FULL GROUP BY的行为.在MySQL中使用它并不能保证它的价值order1.order_datetime,MySQL只选择一个值,结果可能是意外的.
您需要对列表中的GROUP BY所有项目使用或聚合SELECT(类似于上面的内容),或者您必须重写查询.您可以使用以下任何一种方法:
SELECT order1.user_id,
min(order1.order_datetime) order_datetime,
SUM(order2.order_total)
FROM order_table order1
JOIN order_table order2 ON order1.user_id = order2.user_id
GROUP BY order1.user_id
Run Code Online (Sandbox Code Playgroud)
这适用于聚合order_datetime,然后您不必按日期分组.
你可以使用sum() over():
SELECT order1.user_id,
order1.order_datetime,
SUM(order2.order_total) over(partition by order1.user_id) order_total
FROM order_table order1
JOIN order_table order2 ON order1.user_id = order2.user_id
Run Code Online (Sandbox Code Playgroud)
或者可以使用子查询重写.
SELECT order1.user_id,
order1.order_datetime,
order2.order_total
FROM order_table order1
JOIN
(
select SUM(order_total) order_total, user_id
from order_table
group by user_id
) order2
ON order1.user_id = order2.user_id
Run Code Online (Sandbox Code Playgroud)