Programming/DB

ORACLE ORA-01427: 단일 행 하위 질의에 2개 이상의 행이 리턴되었습니다 오류 해결 방법

마실개 2025. 4. 7. 10:23
반응형

ORA-01427: 단일 행 하위 질의에 2개 이상의 행이 리턴되었습니다 오류는 Oracle 데이터베이스에서 SQL 실행 중 발생하는 일반적인 오류입니다.
이 오류는 단일 행을 기대하는 하위 질의(subquery) 가 여러 개의 행을 반환할 때 발생합니다.

1. 오류 원인

SQL 문에서 = 연산자와 함께 사용된 하위 질의가 여러 개의 행을 반환하는 경우 오류가 발생합니다.
단일 행 하위 질의는 반드시 하나의 값만 반환해야 합니다.

잘못된 SQL 예제

SELECT emp_name 
FROM employees 
WHERE dept_id = (SELECT dept_id FROM departments WHERE dept_name LIKE 'S%');

 

위 쿼리는 departments 테이블에서 dept_name이 'S'로 시작하는 모든 dept_id 값을 반환합니다.
그러나 WHERE dept_id = (하위 질의)는 단일 값을 기대하지만,
만약 하위 질의가 여러 행을 반환하면 ORA-01427 오류가 발생합니다.


2. 해결 방법

방법 1: 하위 질의가 단일 값만 반환하도록 수정

LIMIT 1이 없는 Oracle에서는 ROWNUM = 1을 사용하여 하나의 값만 가져올 수 있습니다.

 
SELECT emp_name 
FROM employees 
WHERE dept_id = ( SELECT dept_id FROM departments WHERE dept_name LIKE 'S%' AND ROWNUM = 1 );

이렇게 하면 ROWNUM = 1 조건을 사용하여 하나의 값만 반환하도록 보장합니다.

방법 2: IN 연산자로 다중 행 처리

하위 질의가 여러 개의 값을 반환할 수 있도록 = 대신 IN을 사용합니다.

 
SELECT emp_name 
FROM employees 
WHERE dept_id IN ( SELECT dept_id FROM departments WHERE dept_name LIKE 'S%' );

이 방법은 dept_name이 'S'로 시작하는 모든 dept_id를 가져와 IN 조건으로 필터링합니다.

방법 3: EXISTS 사용

하위 질의의 조건이 존재하는지만 확인할 경우 EXISTS를 사용할 수 있습니다.

 
SELECT emp_name 
FROM employees e 
WHERE EXISTS ( SELECT 1 FROM departments d WHERE d.dept_id = e.dept_id AND d.dept_name LIKE 'S%' );

이 방법은 성능 최적화에도 유리할 수 있습니다.


3. 결론

ORA-01427 오류는 하위 질의가 하나의 값만 반환해야 하는 경우에 여러 개의 행이 반환될 때 발생합니다.
이를 방지하려면 ROWNUM = 1을 사용하여 단일 값을 강제하거나,
다중 행을 허용하는 IN, EXISTS와 같은 연산자를 적절히 사용하는 것이 중요합니다.

반응형