首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mysql到Oracle重写不同的结果

Mysql到Oracle重写不同的结果
EN

Stack Overflow用户
提问于 2012-07-20 09:21:39
回答 2查看 174关注 0票数 0

我重写了一个从Mysql到oracle的查询,而Mysql给了我一行,oracle给出了倍数,只是想知道为什么?

Mysql查询

代码语言:javascript
复制
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

代码语言:javascript
复制
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和listagg中得到了相同的结果。但是,如果我将group_concat添加回,则结果在Mysql和Oracle之间有所不同。

EN

回答 2

Stack Overflow用户

发布于 2012-07-20 09:28:27

因为mysql GROUP BY不像ANSI SQL GROUP BY那样工作,而ANSI SQL使用它。

ANSI SQL中,必须将不属于聚合函数(MINMAXAVG等)的所有字段放在SELECT语句中。在GROUP BY条款中。

Mysql制造了一个“魔法”(有时很好,有时.分组,即使您没有将所有字段都放在GROUP BY子句中。

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

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

编辑

好的,你的更正。

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

代码语言:javascript
复制
id  name    description category
1   n1      d1          1
2   n2      d2          1
3   n2      d3          2

如果选择id、名称、描述、类别

和按类别分组

MySQL会给你两行

代码语言:javascript
复制
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、分类分组,因此id、name、description和分类的不同值将返回不同的行,您将得到这3行。

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

代码语言:javascript
复制
SELECT MIN(id), MIN(name), MIN (description) category
from xxx
GROUP BY category

或者使用子查询。

票数 1
EN

Stack Overflow用户

发布于 2012-07-20 09:33:12

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11576512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档