ORA-01787: only one clause allowed per query block (ORA-01787: 질의 블록당 1개의 구만 허용됩니다)

ORA-01787 only one clause allowed per query block

'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' 별 평균을 바로 구한 것과는 차이가 있겠지요?

댓글 쓰기
가져가실 때, 출처 표시 부탁드려요! 감사합니다. 💗