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 error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.