ORA-01427 : 단일 행 하위 질의에 2개 이상의 행이 리턴되었습니다.(single-row subquery returns more than one row)

하위 쿼리의 리턴을 상위 쿼리의 조건문 값으로 설정하는 경우 발생하는 오류에 대해서 소개합니다.

조사 환경

이 글은 “Windows10 Pro에서 무상으로 이용가능한 Oracle Database Express Edition 18c 설치하기” 글에서 작성한 XEPDB1 플러그인 데이터베이스(PDB) 환경에서 조사했습니다.

scott/tiger접속을 위해서는 “연습 데이터용 샘플 스키마 “SCOTT” 작성하기” 글을 참조하십시오.

그외 이하 환경에서도 연습할 수 있습니다.

Windows Server 2012 R2에서 Oracle Database 12.2.0.1.0 for Microsoft Windows x64 설치 하기
Windows Server 2019 에서 Oracle Database 19c for Microsoft Windows x64 설치 하기

오류 샘플

하위 쿼리의 단일 행 리턴을 상위 쿼리의 조건문 값으로 사용하는 경우 복수 행 리턴은 다음과 같이 오류가 발생합니다.

한글 오류 메시지

C:\>set nls_lang=KOREAN_KOREA.KO16MSWIN949
C:\>sqlplus scott/tiger@localhost/xepdb1
SQL> desc emp
 Name           Null?    Type
 --------- -------- -------------
 EMPNO     NOT NULL NUMBER(4)
 ENAME              VARCHAR2(10)
 JOB                VARCHAR2(9)
 MGR                NUMBER(4)
 HIREDATE           DATE
 SAL                NUMBER(7,2)
 COMM               NUMBER(7,2)
 DEPTNO             NUMBER(2)

SQL> desc dept
 Name    Null?    Type
 ------- -------- -------------
 DEPTNO  NOT NULL NUMBER(2)
 DNAME            VARCHAR2(14)
 LOC              VARCHAR2(13)

SQL> select deptno, dname from dept;

DEPTNO DNAME
------ --------------
    10 ACCOUNTING
    20 RESEARCH
    30 SALES
    40 OPERATIONS

SQL> select DEPTNO,EMPNO, ENAME from emp;
DEPTNO      EMPNO ENAME
------ ---------- ----------
    20       7369 SMITH
    30       7499 ALLEN
    30       7521 WARD
    20       7566 JONES
    30       7654 MARTIN
    30       7698 BLAKE
    10       7782 CLARK
    20       7788 SCOTT
    10       7839 KING
    30       7844 TURNER
    20       7876 ADAMS
    30       7900 JAMES
    20       7902 FORD
    10       7934 MILLER
    20       9999 SHORTNAME

15 rows selected.

SQL> select EMPNO, ENAME from emp where deptno = ( select deptno from dept );
select EMPNO, ENAME from emp where deptno = ( select deptno from dept )
                                              *
1행에 오류:
ORA-01427: 단일 행 하위 질의에 2개 이상의 행이 리턴되었습니다.

영문 오류 메시지

C:\>set nls_lang=American_America.AL32UTF8
C:\>sqlplus scott/tiger@localhost:1521/XEPDB1
SQL> select EMPNO, ENAME from emp where deptno = ( select deptno from dept );
select EMPNO, ENAME from emp where deptno = ( select deptno from dept )
                                              *
ERROR at line 1:
ORA-01427: single-row subquery returns more than one row

정상 샘플

다음과 같이 서브 쿼리가 단일행을 리턴 하면 정상 종료합니다.

SQL> select EMPNO, ENAME from emp where deptno = ( select deptno from dept where dname = 'ACCOUNTING');

     EMPNO ENAME
---------- ----------
      7782 CLARK
      7839 KING
      7934 MILLER

위의 SQL문을 풀어서 설명하면 다음과 같습니다. 위의 쿼리는 단일 행 결과 10을 리턴합니다.

SQL> select deptno from dept where dname = 'ACCOUNTING';

    DEPTNO
----------
        10
10을 조건문의 값으로 설정하면 같은 결과를 얻을 수 있습니다.

SQL> select EMPNO, ENAME from emp where deptno = 10
     EMPNO ENAME
---------- ----------
      7782 CLARK
      7839 KING
      7934 MILLER
제목과 URL을 복사했습니다