하위 쿼리의 리턴을 상위 쿼리의 조건문 값으로 설정하는 경우 발생하는 오류에 대해서 소개합니다.
조사 환경
이 글은 “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