728x90
반응형

아우터-조인은 조건에 만족하지 않은 데이터도 결과에 나온다.

- 기준 데이터 집합: 아우터-조인의 기준이 되는 집합

- 참조 데이터 집합: 아우터-조인의 참조가 되는 집합

'기준 데이터 집합'은 조인 조건을 만족하지 않아도 모두 결과에 포함된다.

아우터-조인을 사용하려면, 조인 조건 컬럼 한쪽에 '(+)' 표시를 추가하면 된다.

'기준 데이터 집합'과 '참조 데이터 집합'은 '(+)' 표시로 구분한다.

조인조건에 '(+)' 표시가 붙은 쪽은 '참조 데이터 집합', 없는 쪽은 '기준 데이터 집합'이다.

 

1. 이너조인

select t1.*, t2.* 

from m_cus t1, t_itm_evl t2
where t1.cus_id = 'CUS_0002' 

and  t1.cus_id = t2.cus_id;

 

2. 아우터조인

select t1.cus_id, t1.cus_nm, t2.cus_id, t2.itm_id, t2.evl_lst_no
from m_cus t1, t_itm_evl t2
where t1.cus_id = 'CUS_0002' and  
t1.cus_id = t2.cus_id(+);

 

M_CUS에는 'CUS_0002'의 데이터가 있지만 T_ITM_EVL에는 'CUS_0002'의 데이터가 없다.

이 상황에서, 이너조인은 아무 결과도 조회되지 않는다.

아우터 조인을 해야만 'CUS_0002' 고객의 정보가 조회된다.

 

3. 아우터조인의 필터조건

select t1.cus_id, t1.cus_nm, t2.cus_id, t2.itm_id, t2.evl_lst_no, t2.evl_dt
from m_cus t1, t_itm_evl t2
where t1.cus_id = 'CUS_0073'
and t1.cus_id = t2.cus_id(+)
and t2.evl_dt >= to_date('20170201', 'YYYYMMDD')
and t2.evl_dt < to_date('20170301', 'YYYYMMDD');

select t1.cus_id, t1.cus_nm, t2.cus_id, t2.itm_id, t2.evl_lst_no, t2.evl_dt
from m_cus t1, t_itm_evl t2
where t1.cus_id = 'CUS_0073'
and t1.cus_id = t2.cus_id(+)
and t2.evl_dt(+) >= to_date('20170201', 'YYYYMMDD')
and t2.evl_dt(+) < to_date('20170301', 'YYYYMMDD');

 

두 SQL 모두 아우터조인을 하고 있다.

첫번째 SQL은 조회되는 결과가 없다. 두번째만 결과가 나온다.

아우터 조인을 사용할 때는 참조 데이터 집합의 필터조건에 '(+)' 표시를 해주는 것이 일반적이다.

 

4. 아우터조인 응용

고객별 1월의 주문건수를 구하는 SQL. 주문이 없는 고객은 주문건수가 0으로 조회되어야 한다.

아래와 같이 아우터조인을 활용할 수 있다.

 

select t1.cus_id, count(*) ord_cnt_1, count(t2.ord_seq) ord_cnt2 
from m_cus t1, t_ord t2
where t1.cus_id = t2.cus_id(+)
and t2.ord_dt(+) >= to_date('20170101', 'YYYYMMDD')
and t2.ord_dt(+) < to_date('20170201', 'YYYYMMDD')
group by t1.cus_id
order by count(*), t1.cus_id;

 

고객테이블을 기준집합으로 아우터조인 했기 때문에, 주문이 없는 고객도 모두 조회가 가능하다.

 

728x90
반응형

+ Recent posts