본문 바로가기
Database/Oracle

[ORACLE] ORA-01789 오류 해결 : ORDER BY의 잘못된 위치와 UNION 사용 시 주의사항

by Papa Martino V 2025. 7. 28.
728x90

ORA-01789 오류 해결 : ORDER BY의 잘못된 위치와 UNION 사용 시 주의사항
[ORACLE] ORA-01789

 

Oracle Database에서 ORA-01789: query block has incorrect number of result columns 오류는 주로 SQL 쿼리에서 ORDER BYUNION, 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 오류 원인 수정 예시

SELECT name FROM employees
ORDER BY name
UNION
SELECT name FROM contractors;
        
ORDER BYUNION 앞 SELECT문에 포함됨

SELECT name FROM employees
UNION
SELECT name FROM contractors
ORDER BY name;
        

(SELECT dept_id FROM dept ORDER BY dept_id)
UNION
(SELECT dept_id FROM old_dept);
        
서브쿼리 내 ORDER BY 사용

SELECT dept_id FROM dept
UNION
SELECT dept_id FROM old_dept
ORDER BY dept_id;
        

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
728x90