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
MySQL使用一個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
,一個總量適用於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
或者這可以使用子查詢重寫。
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
因爲MySQL不喜歡小貓。 – Kermit 2013-02-27 18:22:28
因爲MySQL認爲只需選擇任意'order1.order_datetime'即可。在其他嚴重的數據庫平臺中,won syntax語法是不合法的。僅僅因爲MySQL對語法的鬆懈並不能使它正確。 – 2013-02-27 18:25:41