일을 하다보면 데이터베이스 쿼리를 짜고 실행하고 하는데 그 중에 오류가 발생한 경우가 생김.
Oracle에서 쿼리를 실행할 때 "Subquery returns more than 1 row"라는 오류가 발생하였는데
이 오류가 발생하는 원인을 찾아봤더니
"서브쿼리가 단일 행만 반환해야 하는 상황에서 여러 행을 반환했을 때" 발생한다고 한다.
이 오류는 주로 서브쿼리를 사용하는 조건절이나 SELECT 절에서 잘못된 논리로 인해 나타난다.
1. "Subquery returns more than 1 row" 오류의 발생 원인
- 단일 값만 필요할 때 여러 값을 반환:
" = " 연산자는 단일 값을 비교할 수 있지만, 서브쿼리가 여러 행을 반환하면 오류가 발생 - 다중 행 비교 연산자를 사용하지 않은 경우:
서브쿼리가 여러 행을 반환할 가능성이 있을 때, IN, ANY, ALL 같은 다중 행 연산자를 사용하지 않으면 문제가 발생 - SELECT 절에서 스칼라 서브쿼리를 사용할 때:
SELECT 절에서 서브쿼리가 단일 값을 반환해야 하지만 여러 값을 반환하는 경우 오류 발생
2. 예제 및 해결
1) WHERE 절에서 단일 값 비교에 서브쿼리가 여러 행 반환
예제
SELECT employee_id, first_name FROM employees WHERE department_id = (SELECT department_id FROM departments WHERE location_id = 1700); |
- 위 쿼리에서 서브쿼리는 location_id = 1700 인 모든 department_id를 반환한다.
- 반환된 값이 여러 행이면 = 연산자가 단일 값을 필요로 하므로 오류가 발생
방법1 : IN 연산자로 수정
SELECT employee_id, first_name FROM employees WHERE department_id IN (SELECT department_id FROM departments WHERE location_id = 1700); |
- IN 연산자는 다중 행 비교를 지원하므로 오류 없이 실행
방법 2 : 서브쿼리를 단일 값으로 제한
SELECT employee_id, first_name FROM employees WHERE department_id = (SELECT department_id FROM departments WHERE location_id = 1700 AND ROWNUM = 1); |
- ROWNUM = 1 조건을 추가하여 서브쿼리가 항상 단일 값만 반환하도록 제한
3. 결론
"Subquery returns more than 1 row" 오류는 서브쿼리를 사용할 때 매우 흔히 발생하는 문제로 이를 해결하기 위해서는 서브쿼리가 반환하는 데이터의 행 수를 이해하고, 적절한 연산자나 조건을 사용하여 단일 값을 반환하도록 보장해야 한다.
상황 | 해결방법 |
ㅇ단일 값이 필요한 곳에서 여러 값 반 | IN, ANY, ALL 연산자로 수정 |
서브쿼리를 단일 행으로 제한 | ROWNUM, FETCH FIRST ROW ONLY 사용 |
복잡한 조건 처리 | JOIN으로 재구성 |
'공부방 > DataBase' 카테고리의 다른 글
[Oracle] 데이터베이스에서 문자열 뒤에서 자르기(RIGHT) (0) | 2025.01.09 |
---|---|
[MariaDB] ADD COLUMN 사용법 (0) | 2025.01.03 |
FETCH FIRST ROW (3) | 2024.07.06 |
[Oracle] 콤마로 분리된 문자열을 여러 행으로 변환(REGEXP_SUBSTR) (1) | 2024.03.29 |
[Oracle] 가로(행) 데이터를 세로(열)로 출력 (0) | 2023.12.14 |