Oracle ORA-00935 오류 원인과 해결 방법 완벽 가이드

ORA-00935
2026년 06월 20일 | DBMS Error 가이드

이 글에서 다루는 내용

ORA-00935 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.

ORA-00935 group function is nested too deeply 는?

ORA-00935 에러는 Oracle SQL에서 그룹 함수(집계 함수)를 허용된 중첩 수준을 초과하여 사용할 때 발생합니다. Oracle은 일반 SELECT 문에서는 그룹 함수를 단 1단계까지만 중첩을 허용하며, 분석 함수나 서브쿼리 없이 MAX(SUM(AVG(…))) 와 같이 3단계 이상 중첩하면 이 에러가 발생합니다. 실무에서는 복잡한 집계 쿼리를 작성하다가 무의식적으로 함수를 과도하게 겹쳐 쓸 때 자주 마주치는 에러입니다.


주요 발생 원인

  • 그룹 함수의 3단계 이상 중첩 사용

Oracle의 일반 SELECT 문에서는 그룹 함수를 최대 2단계(예: MAX(SUM(...)))까지만 중첩할 수 있습니다. MAX(SUM(AVG(salary)))처럼 3단계 이상 중첩하면 Oracle 파서가 이를 거부하고 ORA-00935를 발생시킵니다. 특히 복잡한 보고서 쿼리나 통계 집계 쿼리를 작성할 때 의도치 않게 발생하는 경우가 많습니다.

  • 서브쿼리 없이 동일 레벨에서 중복 집계 시도

하나의 SELECT 절 안에서 서브쿼리나 인라인 뷰(Inline View)를 사용하지 않고, 단일 쿼리 블록 내에서 여러 단계의 집계를 동시에 처리하려 할 때 에러가 발생합니다. 예를 들어, 부서별 합계를 먼저 구한 뒤 그 결과의 최댓값을 다시 집계하는 작업을 서브쿼리 없이 한 번에 쓰면 Oracle이 처리할 수 없어 에러를 반환합니다.

  • HAVING 절 또는 ORDER BY 절에서의 잘못된 중첩

HAVING 절이나 ORDER BY 절에서도 그룹 함수를 중첩해서 사용하는 경우 ORA-00935가 발생할 수 있습니다. 예를 들어 HAVING MAX(SUM(amount)) > 1000처럼 작성하면, 이미 GROUP BY로 집계된 결과에 또 다른 그룹 함수를 잘못된 방식으로 적용한 것이므로 에러가 발생합니다.


해결 방법

원인 1 해결: 서브쿼리(인라인 뷰)를 활용하여 집계 단계 분리

가장 근본적인 해결책은 집계 단계를 서브쿼리로 분리하는 것입니다. 내부 쿼리에서 1차 집계를 수행하고, 외부 쿼리에서 2차 집계를 수행하면 Oracle이 정상적으로 처리합니다.

에러 발생 예제:

-- ORA-00935 발생: 3단계 중첩
SELECT MAX(SUM(AVG(salary)))
FROM employees
GROUP BY department_id;

해결된 예제:

-- 1단계: 부서별 평균 급여 계산 (인라인 뷰)
-- 2단계: 평균 급여의 합계 계산
-- 3단계: 외부에서 최댓값 계산
SELECT MAX(dept_sum)
FROM (
    SELECT SUM(avg_sal) AS dept_sum
    FROM (
        SELECT department_id, AVG(salary) AS avg_sal
        FROM employees
        GROUP BY department_id
    )
);

원인 2 해결: WITH 절(CTE)을 활용한 단계적 집계

Oracle 9i 이상에서는 WITH 절(Common Table Expression)을 사용하여 집계 단계를 명확하게 분리할 수 있습니다. 가독성도 높아지고 유지보수도 쉬워집니다.

-- WITH 절을 활용한 다단계 집계
WITH dept_avg AS (
    -- 1단계: 부서별 평균 급여
    SELECT department_id,
           AVG(salary) AS avg_salary
    FROM employees
    GROUP BY department_id
),
dept_sum AS (
    -- 2단계: 평균 급여의 합계
    SELECT SUM(avg_salary) AS total_avg_sum
    FROM dept_avg
)
-- 3단계: 최종 결과 조회
SELECT MAX(total_avg_sum) AS final_max
FROM dept_sum;

원인 3 해결: HAVING 절 수정 및 분석 함수 활용

HAVING 절에서의 잘못된 중첩은 조건을 재구성하거나 분석 함수(Window Function)를 활용하여 해결합니다.

에러 발생 예제:

-- ORA-00935 발생: HAVING 절에서의 잘못된 중첩
SELECT department_id, SUM(salary)
FROM employees
GROUP BY department_id
HAVING MAX(SUM(salary)) > 50000;

해결된 예제 (서브쿼리 활용):

-- 서브쿼리로 집계 후 HAVING 조건 적용
SELECT department_id, dept_total
FROM (
    SELECT department_id,
           SUM(salary) AS dept_total
    FROM employees
    GROUP BY department_id
)
WHERE dept_total > (
    SELECT AVG(SUM(salary))
    FROM employees
    GROUP BY department_id
);

분석 함수를 활용한 대안:

-- 분석 함수(Window Function)로 중첩 집계 대체
SELECT DISTINCT
    department_id,
    SUM(salary) OVER (PARTITION BY department_id) AS dept_total,
    MAX(SUM(salary) OVER (PARTITION BY department_id))
        OVER () AS max_dept_total
FROM employees;

예방 방법

  • 쿼리 설계 단계에서 집계 레벨을 명확히 정의하기

복잡한 집계 쿼리를 작성하기 전에 종이나 설계 문서에 집계 단계를 먼저 정의하세요. “1단계: 개인별 집계 → 2단계: 부서별 집계 → 3단계: 전사 집계”처럼 계층을 명확히 그린 후, 각 단계를 서브쿼리 또는 CTE로 분리하여 구현하면 ORA-00935를 원천적으로 방지할 수 있습니다. 코드 리뷰 시에도 집계 함수의 중첩 깊이를 반드시 점검하는 습관을 들이세요.

  • Oracle 분석 함수(Window Function)를 적극 활용하기

Oracle의 SUM() OVER(), MAX() OVER(), AVG() OVER() 등의 분석 함수는 복잡한 중첩 집계를 단일 패스로 처리할 수 있게 해줍니다. 특히 Oracle 8i 이상에서 지원되는 이 기능은 성능 면에서도 중첩 서브쿼리보다 유리한 경우가 많습니다. 팀 내 코딩 표준에 “3단계 이상의 집계는 반드시 CTE 또는 분석 함수 사용”을 명시해두면 에러 예방과 코드 품질 향상을 동시에 달성할 수 있습니다.


관련 에러

  • ORA-00934: group function is not allowed here — GROUP BY 없이 그룹 함수를 WHERE 절 등 허용되지 않는 위치에 사용할 때 발생합니다.
  • ORA-00937: not a single-group group function — GROUP BY 없이 일반 컬럼과 그룹 함수를 함께 SELECT할 때 발생합니다.
  • ORA-00979: not a GROUP BY expression — SELECT 절의 컬럼이 GROUP BY 절에 포함되지 않았을 때 발생합니다.
  • ORA-30483: window functions are not allowed here — 분석 함수를 WHERE 절 등 허용되지 않는 위치에 사용할 때 발생하며, 분석 함수로 ORA-00935를 우회하려 할 때 잘못된 위치에 쓰면 마주칠 수 있습니다.

DBMS 에러 코드 시리즈

주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.

본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.

댓글 남기기