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와 같은 연산자를 적절히 사용하는 것이 중요합니다.
'Programming > DB' 카테고리의 다른 글
오라클 SQL 최적화를 위한 Oracle 인덱스 힌트(Index Hint) 사용법과 예제 (0) | 2025.04.08 |
---|---|
오라클 인덱스 구조와 동작 방식 정리 (Oracle Index) (0) | 2025.04.07 |
ORACLE ORA-01555: Snapshot Too Old 오류 해결 방법 (0) | 2025.04.05 |
ORACLE ORA-01652 오류: "임시 세그먼트를 확장할 수 없습니다" 해결 방법 (0) | 2025.04.04 |
오라클 ROW_NUMBER() 함수와 COUNT() OVER 함수 차이 (0) | 2025.04.04 |