오라클을 사용하다 보면 아래와 같은 오류를 종종 보게 됩니다.
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) 그래서 오류가 나옵니다.
서브쿼리 상태에서 해당 오류를 해결하기 위해서 크게 두 가지 방법이 있습니다.
- = 대신 IN을 사용한다. (여러 개의 레코드를 조회하는 방법)
- 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를 이용하면 깔끔하게 만들 수 있습니다.
'컴퓨터 > Oracle' 카테고리의 다른 글
Oracle (8) - 커서(Cursor) (0) | 2025.01.09 |
---|---|
Oracle (7) - 인덱스를 타는지 확인하는 방법 (EXPLAIN PLAN) (1) | 2024.12.28 |
Oracle (5) - SELECT문에서 IF ELSE를 사용하기 DECODE (2) | 2023.12.23 |
Oracle (4) - null값을 치환하는 방법 (NVL, NVL2, COALESCE) (1) | 2023.12.06 |
Oracle (3) - 순위처리를 해보자 (RANK, DENSE_RANK, ROW_NUMBER) (0) | 2023.11.06 |