1

次のステートメントがMySQLで機能するのに、Oracleでは「GROUPBY式ではない」という理由まで、Oracleの制限を誰かが説明できますか?

  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

order_datetimeOracleが列の処理方法を知らないためですか?GROUP BY order1.user_idMySQLの場合のように、行から受け取った行から列の結果を返すだけではいけませんか?

編集:

すべての列がgroupbyに含まれる必要があることは理解していますが、OracleがMySQLと同様の結果を返さない理由を理解しようとしています(MySQLは各GROUP BYを必要とせず、Oracleは必要です)。

4

3 に答える 3

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

MySQLは、FULLGROUPBYEXTENSION TO GROUP BYを適用しない動作を可能にするを使用します。MySQLでこれを使用しても、の値がどうなるかは保証されません。MySQLは1つの値を選択するだけで、予期しない結果になる可能性があります。order1.order_datetime

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
于 2013-02-27T18:10:15.660 に答える
0

ここで私の関連する質問を参照してください
。Mysqlは非グループ化関数/フィールドの「任意の」値を想定していますが、Oracleはグループ化関数またはgroupbyフィールドの必要性を強制しています

Mysqlマニュアルから:
MySQL extends the use of GROUP BY so that the select list can refer to nonaggregated columns not named in the GROUP BY clause. This means that the preceding query is legal in MySQL. You can use this feature to get better performance by avoiding unnecessary column sorting and grouping. However, this is useful primarily when all values in each nonaggregated column not named in the GROUP BY are the same for each group. The server is free to choose any value from each group, so unless they are the same, the values chosen are indeterminate. Furthermore, the selection of values from each group cannot be influenced by adding an ORDER BY clause. Sorting of the result set occurs after values have been chosen, and ORDER BY does not affect which values the server chooses.

于 2013-02-27T18:19:44.790 に答える
0

Oracleでは、1つの列だけでグループ化し、すべてを試してはいけない場合は、Selectですべての列を指定する必要があります。group by

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
于 2013-02-27T18:11:44.490 に答える