[Oracle] 연관성 있는 서브쿼리와 연관성 있는 서브쿼리
연관성있는 서브쿼리의 대표적인 예는 EXISTS 연산자를 사용하는 서브쿼리이다.
예제)
*연관성 없는 서브쿼리
select count(*) from employees
where department_id in (select department_id
from departments
where manager_id is not null);
--> EXISTS로 전환
*연관성 있는 서브쿼리
select count(*) from employees emp
where exists (select 1
from departments dep
where dep.manager_id is not null
and emp.department_id = dep.department_id);
--> 데이터의 연관성이 있다는 의미는 서브쿼리와 메인쿼리 사이에서 조인이 사용되었음을 의미한다.
* 연관성 있는 서브쿼리의 경우에는 조인을 수반하므로 반드시 별칭을 사용해야 한다.
(정의) 연관성 있는 서브쿼리: 메인쿼리에 독립적이지 않고 연관관계, 즉 조인을 통해 연결되어 있는 쿼리를 말한다.
<연관성 있는 서브쿼리의 활용>
예제)
* 일반 조인 사용 시
select emp.first_name||' '||emp.last_name emp_names,
emp.department_id,
dep.department_name
from employees emp, departments dep
where emp.department_id=dep.department_id;
* 연관성 있는 서브쿼리 사용 시
select emp.first_name||' '||emp.last_name emp_names,
emp.department_id,
(select dep.department_name
from departments dep
where dep.department_id = emp.department_id) dep_name
from employees emp;
연관성 있는 서브쿼리는 이와 같이 select list에 자주 쓰인다. 연관성 없는 서브 쿼리도 select list에 올 수는 있지만 실제로 그런 경우는 거의 없다.
왜 그럴까?
연관성 없는 서브쿼리의 경우 다중 로우를 추출하는 경우가 많음.
반면 연관성 있는 서브쿼리의 경우 메인쿼리와의 연관성(=조인)이 있기 때문에 SELECT LIST에 올 수 있으며, 이러한 경우 단일 로우를 추출하게 된다.
* 뇌를 자극하는 오라클 프로그래밍 (홍형경 저) 참조함.
'Oracle_DB_Unix admin > (3)뇌자극 오라클 PL/SQL' 카테고리의 다른 글
PL/SQL 문장과 커서 (0) | 2015.10.08 |
---|---|
PL/SQL 객체 (0) | 2015.10.04 |
[Oracle] 인라인뷰 (0) | 2015.10.03 |
[Oracle] 서브쿼리의 분류 (0) | 2015.10.03 |
[Oracle] EXISTS 연산자의 활용 (0) | 2015.10.03 |