2013-09-02 1 views
-1

PostgreSQL 버전 gcc (우분투/Linaro 4.7.2-22ubuntu5)에 의해 컴파일 된 x86_64-unknown-linux-gnu의 PostgreSQL 9.1.9) 4.7.2, 64 비트, 내 질문에 두 테이블을 조인하고있다, 그것은 TEMP1 및 TEMP2로, 여기 내가이 두 테이블을 가입해야 이름을 보자하나의 테이블에서 그룹을 선택하고 다른 테이블을 선택할 때 PostgreSQL이 받아들이지 않는 이유

테이블 구조는

marks_map 
marks int 
stud_id int 

student 
stud_id int 
class_id int 

여기 내 쿼리입니다

select class_id,stud_id,count(marks) 
from student as s 
inner join marks_map as m on (s.stud_id=m.stud_id) group by stud_id 
여기에

내가

ERROR: column "s.class_id" must appear in the GROUP BY clause or be used in an aggregate function 

같은 오류가 왜이 오류가 발생할 않는거야? 을 group by에 사용하면 성공적으로 실행됩니다.

+1

Group By 작동 방식 : class_id로 그룹화하지 않은 경우 원하는 여러 class_id 값 중 어떤 것을 알 수 있습니까? – IMSoP

+0

안녕하세요, 내 실제 쿼리에서 3 개 이상의 테이블에 가입해야하는데이 쿼리는 이와 같은 버그를 표시하기위한 것입니다. – kumar

+0

도중에'count (marks)'가 아닌'sum (marks)'을 원할 수도 있습니다. – IMSoP

답변

1

statement의 선택 부분에이 속성에 대한 집계 함수가 없기 때문에 group by 절에 class_id 속성을 추가해야합니다. 그룹에서

BY 문에서도 당신은 당신이 BY 절 GROUP 후 집계되지 않은하는 동안 모든 속성을 추가해야합니다. 예를 들어

:

방법 group by 작업의
SELECT 
non-aggregating-attr-1, non-aggregating-attr2, non-aggregating-attr3, sum(attr4) 
FROM 
table 
GROUP BY 
non-aggregating-attr-1, non-aggregating-attr2, non-aggregating-attr3 
+0

@ micro.widmer, 맞습니다. 왜 이렇게 되었습니까? 그것들은 group by과 aggregate 함수에서 사용되지 않는 컬럼을 선택하게하는 다른 방법이다. – kumar

+0

다른 사람들이 이미 주석을 달았으므로, 그것은 GROUP BY가 작동하는 방식이다. 당신이 그것을 기대하거나 필요로 할 때 정확하게 작동하지 않는 것은 무엇입니까? –

+0

@ mirco.widmer 주어진 'student_id'에 대해 하나 이상의 'class_id'가있는 경우 무엇을하고 싶습니까? 임의로 선택하여 보여 주시겠습니까? (만약 그렇다면'DISTINCT ON'을 원한다. PostgreSQL 매뉴얼을 참고하라.) 또는 모든 학생 ID/클래스 ID 조합을 나열하십시오.이 경우 학생 ID와 클래스 ID를 모두 'GROUP BY'해야합니다. –

0

.

당신은

select 
    array_agg(class_id) as arr_class_id, 
    stud_id, count(marks) 
from student as s 
    inner join marks_map as m on (s.stud_id=m.stud_id) 
group by stud_id 

같은 데이터를 확인하고 각 그룹에 대해 얼마나 CLASS_ID 볼 수 있습니다. 때때로 CLASS_ID는 stud_id (각 그룹의 배열에 하나의 elemnet가)에서 의존한다, 그래서 당신은 같은 더미 집계를 사용할 수 있습니다 : 당신은 '아무튼 단순화 된 경우에 문제를 이해 할 수 있어야한다

select 
    max(class_id) as class_id, 
    stud_id, count(marks) 
from student as s 
    inner join marks_map as m on (s.stud_id=m.stud_id) 
group by stud_id 
0

JOIN조차도 포함됩니다.

쿼리 SELECT x,[other columns] GROUP BY xx마다 고유 한 값을, [기타 열] x마다에 대해 하나의 행이 출력 해야한다는 사실을 나타낸다. student 표는 두 개의 항목이 곳

이제 간단한 예제를 찾고 :

stud_id = 1, CLASS_ID = 1
stud_id = 1, CLASS_ID = 2

을 그리고 우리는 요청 SELECT stud_id,class_id FROM student GROUP BY class_id.

stud_id의 유일한 값이 1입니다.

그래서 우리는 SQL 엔진을 이야기하고, 나에게 하나의 stud_id=1와 행과 함께 제공 class_id의 값을 제공합니다. 그리고 문제는 하나가 아니라 두 개의 그러한 값인 1과 2가 있다는 것입니다. 그래서 어느 것이 선택해야합니까? 무작위로 선택하는 대신, SQL 엔진은 이라는 별개의 값이 stud_id 인 각각의 값이 class_id이라는 규칙이 없기 때문에 질문이 처음에는 개념적으로 가짜라는 오류를 산출합니다. 한편

, 비 GROUP'ed 출력 열을 얻는 방법을 말한다, 그 때 누락 된 규칙을 제공 min, max 또는 count처럼 하나에 일련의 값을 변환 집계 함수가있는 경우 몇 개에서 하나의 값. 그래서 SQL 엔진은 예를 들어 SELECT stud_id,count(class_id) FROM student GROUP BY stud_id;과 함께 OK입니다.

또한

오류가 사라질 때까지 순수하게 구문 것처럼, 절하여 그룹에 표시해야하는 오류 열 "somecolumn"에 직면했을 때, 당신은 단지 GROUP BY에 열을 추가하고 싶지 않아 문제. 이는 의미 론적 문제이며 GROUP BY에 추가 된 각 열은 SQL 엔진에 제출 된 질문의 의미를 변경합니다.

즉, GROUP BY x,y은 (x, y) 쌍의 각 고유 값에 대해 을 의미합니다. GROUP BY x을 의미하는 것은 아니며, 오류가 발생하기 때문에 y도 던져 보겠습니다.

관련 문제