안녕하세요, 코린이의 코딩 학습기 채니 입니다.
개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.
단일/다중행 다중컬럼 서브쿼리
- 서브쿼리 결과가 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연산자를 통해 값 비교를 할 수 있었던 것이죠.
반드시 비교하는 값들의 순서가 동일해야 하므로 유의!!!!!!
'DataBase > Oracle' 카테고리의 다른 글
SUB-QUERY) 스칼라 서브쿼리, inline-view (0) | 2022.04.22 |
---|---|
SUB-QUERY) 상호연관 서브쿼리 (exists, not exists) (0) | 2022.04.21 |
SUB-QUERY) 다중행 단일컬럼 서브쿼리 (any/some, all) (0) | 2022.04.21 |
SUB-QUERY) 단일행 단일컬럼 서브쿼리 (0) | 2022.04.21 |
SUB-QUERY) 서브쿼리란?, 서브쿼리의 조건 (0) | 2022.04.21 |