ORACLE ORA-01427: 단일 행 하위 질의에 2개 이상의 행이 리턴되었습니다 오류 해결 방법
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와 같은 연산자를 적절히 사용하는 것이 중요합니다.