【问题标题】:Mysql to Oracle rewrite different resultsMysql to Oracle rewrite 不同的结果
【发布时间】:2012-07-20 09:21:39
【问题描述】:

我已经重新编写了一个从 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 之间有所不同。

【问题讨论】:

  • 查询将在 Oracle 中失败,出现 ORA-00979:不是 GROUP BY 表达式。你为什么不给我们一个工作的例子?
  • 如果将 MySQL 查询中的 GROUP BY 更改为包含 col1、col2 和 col3,会发生什么情况?那么结果是否匹配?如果是这样,问题是 MySQL 允许但 Oracle 不允许的不完整 GROUP BY。
  • Bob 是的,如果我添加列 col1、col2、col3,结果确实匹配,我不知道如何摆脱这种情况,我们将不胜感激

标签: sql oracle aggregate-functions


【解决方案1】:

因为 mysql GROUP BY 不能像 Oracle 使用的 ANSI SQL GROUP BY 那样工作。

ANSI SQL 中,您必须将SELECT 语句中存在且不在聚合函数中的所有字段(MINMAXAVG 等)放入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、名称、描述、类别

按类别分组

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、名称、描述、类别分组 因此 id、name、description 和 category 的不同值将返回不同的行 你会得到 3 行。

要获得类似 Mysql 的内容,您可以在不想分组的字段上使用 AGGREGATE 函数

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

或使用子查询。

【讨论】:

  • 抱歉为oracle查询添加了其他列
  • @jhon.smith 好的,我明白了。我补充了一些解释。
  • 将group_concat添加到查询组合后不高兴mysql返回不同的值和oracle返回不同​​的结果
【解决方案2】:

MySQL 不会强制所有非聚合列成为 Group by 子句的一部分。

【讨论】:

    猜你喜欢
    • 2011-11-08
    • 2023-03-08
    • 1970-01-01
    • 2013-09-07
    • 1970-01-01
    • 2014-05-02
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多