본문 바로가기
DataBase/Oracle

SUB-QUERY) 단일/다중행 다중컬럼 서브쿼리

by 박채니 2022. 4. 21.

안녕하세요, 코린이의 코딩 학습기 채니 입니다.

 

개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.


단일/다중행 다중컬럼 서브쿼리

- 서브쿼리 결과가 1행 n열인 경우 : = 동등비교 연산자 사용

- 서브쿼리 결과가 n행 m열인 경우 : in, any/some, all, exists 연산자 사용

 

1행 2열을 리턴하는 서브쿼리

- ( ~ , ~ ) = ( ~ , ~를 리턴하는 서브쿼리)

퇴사한 직원이 한 명 있는데, 이 사원과 같은 부서, 같은 직급의 사원 조회 (사원명, 직급코드, 부서코드, 퇴사여부)

select
    emp_name, dept_code, job_code, quit_yn
from
    employee
where
    (dept_code, job_code) = (
            select
                dept_code, job_code -- 순서가 동일해야됨
            from
                employee
            where
                quit_yn = 'Y'
        );

(부서코드, 직급코드) = (부서코드, 직급코드를 리턴하는 서브쿼리) 를 통해서 퇴사자인 '이태림'과 같은 부서, 같은 직급을 가진 사원을 조회하였습니다.

 

만일 퇴사자가 '이태림' 한 명이 아니라 두 명이라고 하였을 때는 어떻게 될까요?

우선 '유하진'을 퇴사 처리 해보도록 하겠습니다.

-- 유하진 금일 퇴사!
update 
    employee
set
    quit_yn = 'Y', 
    quit_date = sysdate
where
    emp_name = '유하진';
commit;

 

select * from employee where quit_yn = 'Y';

퇴사자가 총 '유하진', '이태림'으로 두 명이 되었습니다.

 

2행 2열을 리턴하는 서브쿼리

퇴사한 직원과 같은 부서, 같은 직급인 사원 조회 (사원명, 직급코드, 부서코드, 퇴사여부)

select
    emp_name, job_code, dept_code, quit_yn
from
    employee
where
    (dept_code, job_code) in (
            select 
                dept_code, job_code 
            from 
                employee 
            where 
                quit_yn = 'Y'
        );

퇴사한 직원의 정보가 하나가 아니기 때문에 동등비교(=)연산자로는 추출이 어렵습니다.

따라서 in 연산자를 이용해서 각 퇴사한 직원의 정보를 담아 메인쿼리에 리턴해주었습니다.

in연산자는 여러 행을 하나의 값으로 위처럼 만들어줄 수 있는 연산자입니다.

따라서 in연산자를 통해 값 비교를 할 수 있었던 것이죠.

 

반드시 비교하는 값들의 순서가 동일해야 하므로 유의!!!!!!