0

Mysql から oracle へのクエリを書き直しましたが、Mysql は 1 つの行を与え、oracle は倍数を与えるのはなぜか?

Mysql クエリ

select  me.col1,
        me.col2,
        me.col3,
        min(col3) as me_col3 ,
        group_concat(col2) col4,
from
    my_sql_table me
group by me.col2
order by col3

Oracle に書き換える

select  
        me.col1,
        me.col2,
        me.col3,
        min(col3) over (partition by episode_id order by col3) as me_col3 ,
        LISTAGG(col2, ',') WITHIN GROUP (ORDER BY col3) over (partition by col2)
from
    my_sql_table me
group by me.col1,me.col2,me.col3
order by col3

そのクエリを書き換えて、Mysql と Oracle で同じ結果が得られるようにする方法はありますか?


いくつかの調査を行ったところ、を削除するgroup_concatlistagg、Mysql と Oracle で同じ結果が得られることがわかりました。しかし、group_concatバックを追加すると、Mysql と Oracle の間で結果が異なります。

4

2 に答える 2

1

mysqlが、Oracle が使用するGROUP BYとして機能しないことが原因です。ANSI SQL GROUP BY

では、集約関数 ( 、、など) にないステートメントに存在するすべてのフィールドを句ANSI SQLに入れる必要があります。SELECTMINMAXAVGGROUP BY

GROUP BYMysql は、すべてのフィールドを句に入れなくても、「魔法の」(時にはうまく、時には...驚くような) グループ化を行います。

http://www.mysqltutorial.org/mysql-group-by.aspx

ところで、あなたの 2 番目のクエリが Oracle で機能することに本当に驚きました。

編集

あなたの訂正でわかりました。

さて、あなたがそのようなテーブルを持っていると想像してください

id  name    description category
1   n1      d1          1
2   n2      d2          1
3   n2      d3          2

ID、名前、説明、カテゴリを選択した場合

およびカテゴリ別にグループ化

MySQLは2行を提供します

1, n1, d1, 1 // or 2, n2, d2, 1 : you can't really be sure of what you'll get for non grouped fields
3, n2, d3, 2

Oracleでは、id、name、description、categoryでグループ化する必要があるため、id、name、description、およびcategoryの個別の値は個別の行を返し、3行を取得します。

Mysqlのようなものを取得するAGGREGATEには、グループ化したくないフィールドで関数を使用できます

SELECT MIN(id), MIN(name), MIN (description) category
from xxx
GROUP BY category

またはサブクエリを使用します。

于 2012-07-20T09:28:27.410 に答える
0

MySQL は、集約されていないすべての列を Group by 句の一部にすることを強制しません。

于 2012-07-20T09:33:12.250 に答える