[Oracle] 연관성 있는 서브쿼리와 연관성 있는 서브쿼리

2015. 10. 3. 22:15

연관성있는 서브쿼리의 대표적인 예는 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

곰돌곰둘 Oracle_DB_Unix admin/(3)뇌자극 오라클 PL/SQL