0

我已经重新编写了一个从 Mysql 到 oracle 的查询,而 Mysql 给了我一行,而 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

导致 mysqlGROUP BY不能像ANSI SQL GROUP BYOracle 使用的那样工作。

ANSI SQL中,您必须将SELECT语句中存在且不在聚合函数(MIN、、、MAXAVG)中的所有字段放入GROUP BY子句中。

即使您没有将所有字段都放在GROUP BY子句中,Mysql 也会进行“魔术”(有时很好,有时......令人惊讶)分组。

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

顺便说一句,我真的很惊讶您的第二个查询在 Oracle 中有效。

编辑

好的,您的更正。

现在,想象一下你有一张这样的桌子

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

如果您选择 id、name、description、category

并按类别分组

MySQL会给你两行

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 回答