2011-11-14 1 views
3

이 비트가 하나 이상입니다. 나는 3 테이블을 조인 다음 쿼리를 실행하려고합니다.'Order By'절에있는 열을 주장하는 쿼리는 'Group by'절의 열과 일치합니다.

Select t3.id, t3.name, t3.phone_no, t1.reg_dtm, count(t1.reg_dtm) 
from tableA t1, tableB t2, tableC t3 
Where t1.id = t2.id 
And t2.id = t3.id 
Group by t3.id, t3.name, t3.phone_no, t1.reg_dtm 
Order by t2.id, t1.reg_dtm 

위의 쿼리는 다음과 같은 오류를

ORA-00979: not a GROUP BY expression 

를 반환하지만, GROUP BY 절의 모든 조항에 의해 순서가되도록 내가 그것을 변경하는 경우 다음 작동합니다.

Select t3.id, t3.name, t3.phone_no, t1.reg_dtm, count(t1.reg_dtm) 
from tableA t1, tableB t2, tableC t3 
Where t1.id = t2.id 
And t2.id = t3.id 
Group by t3.id, t3.name, t3.phone_no, t1.reg_dtm 
Order by t3.id, t3.name, t3.phone_no, t1.reg_dtm 

정확히 이유는 무엇입니까?

첫 번째 쿼리의 order by 문에 표시된 t2.id가 group by 문이 아니기 때문에 문제가 발생한 것 같습니다. 이것이 원인이라면 왜 그렇게 중요합니까? 나는 전에 이것을 경험 한 적이 없으며 성명서에 의한 그룹과 명령에 의한 어떤 관계도 있다고 생각하지 않았습니다.

나는 위의 테스트를 Oracle 10G와 MySQL에서 테스트했습니다. 사전에

감사 ORDER BY 절은 SELECT 문에 다른 모든 후 실행

+0

첫 번째 SQL 문에 오타가 있습니다. 내 대답을보십시오, (먼 곳). –

+0

암시 적 구문을 다시 사용하면 안됩니다. SQL 반 패턴입니다. 우발적 인 십자가 조인의 대상이되며 나중에 왼쪽 조인으로 변경하려는 경우 유지 관리하기가 더 어렵습니다. 거의 20 년이 지났지 만 그것은 단지 잘못된 구문입니다. – HLGEM

답변

4

실행; GROUPing 시나리오에서 결과 집합은 데이터를 집계하는 데 사용되는 열로 제한됩니다. 초기 결과 집합에 지정된 열이 없으면 처리 엔진은 요청 된 출력으로 수행 할 작업을 이해하지 못합니다.

즉, 쿼리는 t2.id 및 t1.id에 대해 고유 한 값을 반환하지 않으므로 (GROUP BY 절에서 사용되지 않았으므로) 엔진은 해당 순서대로 데이터를 반환 할 수 없습니다 .

4

결과 집합에 안 기술적으로 GROUP BY 절에 언급되지 않은 열 (그들은 집계하지 않는 한을, 즉 max(columnname)) - 그래서 어떻게 ORDER BY 그들에게 의미가 무엇입니까? 다시 말해, 그러한 쿼리는 무엇을 의미할까요?

그러나 MySQL (다른 사람들에 대해 잘 모르는)은 GROUP BY에없는 열을 선택할 수있게하여 초보자가 왜 이상한 쿼리 결과를 얻는 지 궁금해합니다.

사이드 바로, here과 같이 암시 적 조인을 피할 수 있습니다.

+0

문제는 mySQL이 이런 종류의 잘못된 쿼리를 허용하고 OP가 잘못된 구문을 배웠고 whyOracles이 올바른 구문을 고집하는지 궁금합니다 (mySQL이 아닌 다른 대부분의 데이터베이스와 마찬가지로). – HLGEM

3

일반적으로 GROUP BY 절에없고 데이터베이스에 결정적으로 결과를 정렬 할 수있는 방법이 없기 때문에 SELECT 목록의 집계 함수가 아닌 열을 사용하여 정렬 할 수 없습니다. 데이터베이스는 일반적으로 최종 결과에서 그러한 열이 어; 게 집계되는지를 모르기 때문에 결과의 한 행이 예를 들어 기본 테이블의 행을 집계 한 결과 인 경우를 처리하는 f}을 알지 못합니다 1 & 4이고 결과의 또 다른 행은 기본 테이블의 행을 2 & 값으로 집계 한 결과입니다. 3. 결과를 정렬하기 위해 선택하는 방법은 잘못된 것으로 간주 될 수 있습니다. 이제

이 특별한 경우에, 당신은 내 일을하고 있기 때문에 데이터베이스가 이론적으로 ORDER BY t2.id, t1.id는 결정 론적으로 평가 될 수 ORDER BY t3.id, t3.id 의미 적으로 동등한 것으로 인식 할만큼 영리이 될 수 ID 세 사이 사이에 테이블에 조인. 그러나 나는 이런 종류의 쿼리 변환을 옵티 마이저에 내장 한 데이터베이스를 전혀 모릅니다.그리고 그러한 분석이 잘못되었을 때 발생할 수있는 잠재적 인 버그의 절충은 당신이 실행하려고하는 쿼리가 집합 이론의 관점에서 많은 논리적 인 의미를 갖지 않을 때 그것을 포함하는 것에 반대하는 경향이 있습니다.

+0

order by 절에없는 열은 주문할 수 없습니다. 이것은 나에게 이상한 말입니다. – miherrma

+0

@miherrma - 캐치를 가져 주셔서 감사합니다. 네가 맞다. 나는'GROUP BY' 절을 의미했다. 오류를 수정했습니다. –

1

select 절에있는 열로만 주문할 수 있습니다. 따라서 order by t3.ud, t1.reg_dtm은이를 수행해야하며 동일한 의미를 갖습니다.

1

사실 SQL을주의 깊게 읽으면 첫 번째 문에서는 T3.ID로 그룹화하지만 T2.ID로 정렬합니다.

실행중인 실제 SQL이라면 오타가있는 것이 유일한 문제입니다.

관련 문제