
Oracle Database에서 ORA-01789: query block has incorrect number of result columns 오류는 주로 SQL 쿼리에서 ORDER BY가 UNION, INTERSECT, 또는 MINUS 등의 연산자와 함께 잘못된 위치에 사용될 때 발생합니다. 이 오류는 SQL 문법 규칙에 대한 오해에서 비롯되는 경우가 많으며, 그 해결법은 간단하지만 이해 없이 반복해서 발생할 수 있습니다.
1. ORA-01789 오류 설명
ORA-01789 오류는 Oracle SQL 문장에서 ORDER BY절이 잘못된 위치에 배치되었거나, UNION된 서브쿼리 내부에 ORDER BY가 존재할 경우 발생합니다.
ORA-01789: query block has incorrect number of result columns
흔한 상황은 UNION 또는 INTERSECT를 사용하는 두 SELECT 문 중 하나에 ORDER BY 절이 포함되어 있을 때 발생합니다.
2. 오류 발생 예시와 수정 방법
| 오류 발생 SQL | 오류 원인 | 수정 예시 |
|---|---|---|
|
ORDER BY가 UNION 앞 SELECT문에 포함됨 |
|
|
서브쿼리 내 ORDER BY 사용 |
|
3. 핵심 원인 요약
- ORDER BY는 전체 UNION 이후에만 사용할 수 있음
- 개별 SELECT 또는 서브쿼리에 ORDER BY를 포함할 경우 오류 발생
- UNION, INTERSECT, MINUS 연산자는 정렬을 보장하지 않으며, 정렬이 필요할 경우 반드시 전체 쿼리 결과에 대해 정렬
4. SQL 튜닝 시 주의사항
SQL 최적화를 위해 UNION, INTERSECT 등을 사용하는 경우에도 아래 규칙을 반드시 지켜야 합니다.
SELECT ... FROM ...단위에서 정렬은 사용하지 않음- 정렬은 반드시 최종 결과 집합에만 적용
- 서브쿼리에서 ORDER BY가 반드시 필요한 경우는 ROWNUM 또는 FETCH FIRST 등을 함께 사용할 때뿐임
-- 허용되는 예시
SELECT * FROM (
SELECT name FROM employees
UNION
SELECT name FROM contractors
)
ORDER BY name;
5. 실무 사례 분석
배경
한 대기업의 인사 시스템에서 신규 직원과 외부 협력업체 직원을 통합 조회하는 SQL 구문에서 오류 발생
문제 SQL
SELECT emp_name FROM hr_employees ORDER BY emp_name
UNION
SELECT emp_name FROM partner_employees;
원인
첫 번째 SELECT 절에 ORDER BY 포함 → ORA-01789 발생
해결
SELECT emp_name FROM hr_employees
UNION
SELECT emp_name FROM partner_employees
ORDER BY emp_name;
정렬은 전체 결과에 한 번만 수행되어 성능상으로도 이점이 있음
6. Oracle SQL 문법 요약
| 문법 요소 | 허용 위치 | 비고 |
|---|---|---|
| ORDER BY | 전체 쿼리 블록 마지막 | UNION, INTERSECT 이후에만 사용 |
| ROWNUM/FETCH FIRST | 서브쿼리 내부에서도 허용 | 정렬 필요 시 내부 정렬 허용 |
| UNION | SELECT 쿼리 사이 | 중복 제거, 정렬 보장되지 않음 |
| UNION ALL | SELECT 쿼리 사이 | 중복 허용, 성능 향상 |
7. 결론 및 실무 팁
ORA-01789는 Oracle SQL의 정렬 및 UNION 사용 규칙을 숙지하지 않으면 반복적으로 발생할 수 있는 오류입니다. 특히 실무에서 동적으로 SQL을 생성하거나, 서브쿼리를 병합할 경우 무심코 ORDER BY를 남겨두는 일이 잦습니다.
이 오류를 예방하려면 다음 원칙을 기억해야 합니다:
- UNION, INTERSECT, MINUS는 정렬을 보장하지 않음
- ORDER BY는 쿼리의 가장 마지막에만 사용 가능
- 서브쿼리에 ORDER BY가 필요한 경우는 LIMIT이나 ROWNUM과 함께 사용할 때뿐
Oracle SQL은 구문에 매우 엄격하므로, 작은 실수 하나가 전체 배치나 보고서 생성에 장애를 줄 수 있습니다. 정렬 로직을 구조적으로 점검하고 SQL 작성 시 표준 규칙을 지키는 것이 가장 중요합니다.
출처
- Oracle® SQL Language Reference 19c
- Oracle Support Doc ID 155851.1 - ORA-01789 Troubleshooting Guide
'Database > Oracle' 카테고리의 다른 글
| [ORACLE] ORA-01917 오류 원인과 완벽 해결 가이드 (0) | 2025.07.29 |
|---|---|
| [ORACLE] ORA-01843 오류 분석과 해결법 : 날짜 형식 문제 완벽 가이드 (0) | 2025.07.28 |
| [ORACLE] ORA-01741 오류 분석과 해결법 : 부적절한 SELECT 항목 위치 문제 파헤치기 (0) | 2025.07.28 |
| [ORACLE] ORA-01653 오류 해결 가이드 : 테이블스페이스 공간 부족 원인 분석 및 조치 방안 (0) | 2025.07.28 |
| [ORACLE] ORA-01031 오류 해결 가이드 : 권한 부족 문제의 진단과 실무 대응 (0) | 2025.07.28 |