컴퓨터/Oracle

Oracle (6) - ORA-01427 : 단일 행 하위 질의에 2개 이상의 행이 리턴되었습니다

달서비 2024. 3. 7. 23:49

오라클을 사용하다 보면 아래와 같은 오류를 종종 보게 됩니다.

ORA-01427 : 단일 행 하위 질의에 2개 이상의 행이 리턴되었습니다

 

해당 오류는 주로 서브쿼리에서 1건을 초과한 레코드가 나올때 발생하는 에러입니다.

 

예시 데이터

STUDENT_NO (PK) NAME DEPT_NO
20240304 강감찬 100
20240305 이순신 100
20240306 이산 200
20240307 홍길동 300

 

 

문제가 있는 쿼리문을 만들어 보겠습니다.

SELECT STUDENT_NO, DEPT_NO
  FROM EXAMPLE_TABLE T1
 WHERE STUDENT_NO = (
 	SELECT STUDENT_NO
      FROM EXAMPLE_TABLE T2
     WHERE DEPT_NO = 100
 )

해당 쿼리에는 문제가 있습니다. T2 테이블 안에 STUDENT_NO가 들어가는 레코드가 2개가 있습니다. (20240304, 20240305) 그래서 오류가 나옵니다.

 

 

서브쿼리 상태에서 해당 오류를 해결하기 위해서 크게 두 가지 방법이 있습니다.

 

  1.  = 대신 IN을 사용한다. (여러 개의 레코드를 조회하는 방법)
  2. 1개의 레코드만 나오도록 프로그램을 수정한다. 

 

IN을 이용하는 방법

SELECT STUDENT_NO, DEPT_NO
  FROM EXAMPLE_TABLE T1
 WHERE STUDENT_NO IN (
 	SELECT STUDENT_NO
      FROM EXAMPLE_TABLE T2
     WHERE DEPT_NO = 100
 )

여러 개의 레코드를 활용하기 위해서는 IN을 사용하면 됩니다. IN은 괄호 안에 있는 데이터를 검색하는 연산자입니다. IN을 사용하여 조회하면 다음과 같은 결과가 나옵니다.

STUDENT_NO DEPT_NO
20240304 강감찬
20240305 이순

 

1개의 레코드만 나오도록 하는 방법

SELECT STUDENT_NO, DEPT_NO
  FROM EXAMPLE_TABLE T1
 WHERE STUDENT_NO = (
 	SELECT STUDENT_NO
      FROM EXAMPLE_TABLE T2
     WHERE STUDENT_NO = '20240304'
 )

※ 해당 쿼리는 STUDENT_NO가 PRIMARY KEY일때를 가정 했습니다.

에러를 피하기 위한 좋은 방법 중 하나는 1개의 레코드만 나오도록 쿼리를 튜닝하는 것입니다. 1개의 레코드만 나오게 하기 위한 방법 중 하나는 PRIMARY KEY를 이용하면 깔끔하게 만들 수 있습니다.