본문 바로가기
공부방/DataBase

Subquery returns more than 1 row

by SmartCow 2024. 12. 19.

일을 하다보면 데이터베이스 쿼리를 짜고 실행하고 하는데 그 중에 오류가 발생한 경우가 생김.


Oracle에서 쿼리를 실행할 때 "Subquery returns more than 1 row"라는 오류가 발생하였는데
이 오류가 발생하는 원인을 찾아봤더니
"서브쿼리가 단일 행만 반환해야 하는 상황에서 여러 행을 반환했을 때"  발생한다고 한다.
이 오류는 주로 서브쿼리를 사용하는 조건절이나 SELECT 절에서 잘못된 논리로 인해 나타난다.

1. "Subquery returns more than 1 row" 오류의 발생 원인

  1. 단일 값만 필요할 때 여러 값을 반환:
    " = " 연산자는 단일 값을 비교할 수 있지만, 서브쿼리가 여러 행을 반환하면 오류가 발생
  2. 다중 행 비교 연산자를 사용하지 않은 경우:
    서브쿼리가 여러 행을 반환할 가능성이 있을 때, IN, ANY, ALL 같은 다중 행 연산자를 사용하지 않으면 문제가 발생
  3. 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으로 재구성