'ORA-01787: only one clause allowed per query block' 오류는 한 개의 쿼리 블록에서 특정 절을 두 번 이상 사용하였을 때에 발생합니다.
ORA-01787: only one clause allowed per query block
그 중에서도 그룹(GROUP) 절을 예시로 하여 설명을 드릴게요. 그룹 절의 시작을 알리는 'GROUP BY'는 데이터를 그룹화 하여 집계함수를 사용할 때 사용하는데, 쿼리 블록당 오직 한 번만 사용이 가능합니다. 그런데 이를 두 번 이상 사용하면 ORA-01787 오류가 발생하는 것이지요. 이 오류를 해결하기 위해서는 그룹 절을 한 번만 사용해야 하는데요, 한 번 살펴보겠습니다.
다음을 통해 ORA-01787 오류의 문제 원인과 해결 방법에 대한 예시를 보여드리겠습니다.
오류 원인
잘못된 쿼리로 인해 오류가 발생하는 경우입니다. 그룹 절을 두 번 사용해 보았는데요, 아래의 쿼리를 실행하면 다음과 같은 오류 메시지가 나타날 것입니다.
select 1 from dual group by dummy group by dummy;
ERROR at line 1:
ORA-01787: only one clause allowed per query block
해결 방법
해결 방법은 그룹 절을 하나만 사용해야 합니다.
select 1 from dual group by dummy;
1
----------
1
이 쿼리는 정상적으로 실행될 것입니다.
절을 2개 이상 사용해야 하는 경우
그룹 절은 데이터를 특정 기준으로 묶어서 집계할 때 사용합니다. 예를 들어, 여러 개의 그룹을 만들고 각 그룹에 대해 집계 함수를 적용할 수 있습니다. 한 쿼리 블록에서는 그룹 절을 한 번만 사용할 수 있으며, 여러 그룹화 조건이 필요할 때는 서브쿼리나 윈도우 함수를 사용할 수 있습니다.
서브쿼리를 사용하여 GROUP BY를 두 번 사용하는 예제를 살펴보면서 마치도록 하겠습니다!
여러 조건으로 그룹화가 필요하다면, 서브쿼리를 사용할 수 있습니다. 예를 들어, 두 단계로 그룹화해야 한다면 다음과 같이 할 수 있습니다.
SELECT DEPTNO, AVG (AVGSAL)
FROM ( SELECT JOB, DEPTNO, AVG (SAL) AS AVGSAL
FROM EMP
GROUP BY JOB, DEPTNO)
GROUP BY DEPTNO;
DEPTNO AVG(AVGSAL)
---------- -----------
30 1733.33333
20 2308.33333
10 2916.66667
'job', 'deptno' 별 그룹에서 다시 'deptno'로 그룹하여 평균을 구해보았습니다. (위 예제는 두 단계로 그룹화합니다. 첫 번째 서브쿼리에서 'job' 및 'deptno'로 그룹화하고, 그 결과에 대해 다시 'deptno'로 그룹을 합니다.)
SELECT DEPTNO, AVG (SAL)
FROM EMP
GROUP BY DEPTNO;
DEPTNO AVG(SAL)
---------- ----------
30 1566.66667
20 2175
10 2916.66667
'deptno' 별 평균을 바로 구한 것과는 차이가 있겠지요?