我重写了一个从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_concat和listagg,我在Mysql和listagg中得到了相同的结果。但是,如果我将group_concat添加回,则结果在Mysql和Oracle之间有所不同。
发布于 2012-07-20 09:28:27
因为mysql GROUP BY不像ANSI SQL GROUP BY那样工作,而ANSI SQL使用它。
在ANSI SQL中,必须将不属于聚合函数(MIN、MAX、AVG等)的所有字段放在SELECT语句中。在GROUP BY条款中。
Mysql制造了一个“魔法”(有时很好,有时.分组,即使您没有将所有字段都放在GROUP BY子句中。
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、name、description、分类分组,因此id、name、description和分类的不同值将返回不同的行,您将得到这3行。
要获得类似Mysql的内容,可以在不想分组的字段上使用AGGREGATE函数
SELECT MIN(id), MIN(name), MIN (description) category
from xxx
GROUP BY category或者使用子查询。
发布于 2012-07-20 09:33:12
MySQL并不强制所有非聚合列都成为Group子句的一部分。
https://stackoverflow.com/questions/11576512
复制相似问题