2012-07-20 2 views
0

오라클에 대한 MySQL의 쿼리를 다시 작성했습니다. MySQL은 하나의 행을 제공하고 오라클은 왜 궁금해하고 있습니까?오라클 오라클 오라클은 다른 결과를 다시 작성

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의 쿼리

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 

재 작성 방법 MySQL과 오라클이 같은 결과를 얻을 수 있도록 해당 쿼리를 다시 작성하는 어떤 생각?


은 몇 가지 조사를하고 내가 group_concatlistagg을 제거하면 내가 MySQL과 오라클에서 같은 결과를 얻을 수 있음을 발견했다. 그러나 group_concat을 추가하면 MySQL과 Oracle간에 결과가 달라집니다.

+0

ORA-00979와 함께 Oracle에서 쿼리가 실패합니다. GROUP BY가 아님. 왜 우리에게 실제 사례를주지 않습니까? –

+1

col1, col2 및 col3을 포함하도록 MySQL 쿼리의 GROUP BY를 변경하면 어떻게됩니까? 결과가 일치합니까? 그렇다면 문제는 MySQL이 허용하는 불완전한 GROUP BY이지만 Oracle은 그렇지 않습니다. –

+0

밥 그렇습니다. col1, col2, col3 열을 추가하면 결과가 일치하고 어떤 도움을받을 수 있는지 확신 할 수 없습니다. –

답변

1

왜냐하면 mysql GROUP BY이 오라클이 사용하는 ANSI SQLGROUP BY으로 작동하지 않기 때문입니다. ANSI SQL에서

, 당신은 GROUP BY 절에 집계 함수 (MIN, MAX, AVG 등)에없는 SELECT 문에 존재하는 모든 필드를 넣어해야합니다.

GROUP BY 절에 모든 필드를 넣지 않더라도 Mysql은 "마법"(때로는 훌륭하거나 가끔은 ... 놀라운) 그룹화를 만듭니다. 그런데

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

, 나는 정말 두 번째 쿼리는 오라클에서 작동하는지 놀라게하고있다.

편집하여 보정

좋아. 이제

은 MySQL이 두 행

당신에게 줄 것이다 카테고리로 분류

그룹, 당신은 ID, 이름, 설명을 선택 경우 그

id name description category 
1 n1  d1   1 
2 n2  d2   1 
3 n2  d3   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 

오라클의 경우이 필요합니다.ID, 이름, 설명, 범주 별 그룹 id, name, description 및 category의 고유 값은 고유 한 행을 반환합니다. 그러면 3 행을 얻게됩니다.

MySQL은 뭔가를 얻으려면, 당신은 당신이

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

에 그룹화 할 또는 하위 쿼리를 사용하지 않는 필드에 AGGREGATE 기능을 사용할 수 있습니다.

+0

미안하지만 oracle 쿼리 –

+0

@ jhon.smith에 대한 다른 열을 추가했습니다. 더 잘 이해하십시오. 나는 더 많은 설명을했다. –

+0

쿼리 혼합에 group_concat을 추가 한 후 기쁨이 없습니다. mysql이 다른 값을 반환하고 oracle이 다른 결과를 반환합니다. –

0

MySQL은 모든 집계 열을 Group by 절에 포함시키지 않습니다.