SSISO Community

시소당

outer join의 이해

코드  테이블인  tab1과  이를  참조하는  tab2를  조인하여  코드값에  해당하는  tab2의  자료를  조회하고  싶은  경우의  예이다.
select  x.key,  x.fld1,  y.key,  y.col1,  y.col2
  from  tab1  x,  tab2  y
where  x.key  =  y.key(+)
    and  x.fld1  >  ‘aaa’
    and  y.col1  =  10;

이  경우는  tab1에  null이  있기    때문에  원하는  결과가  나오지  못한다.  그러므로  다음과  같이  변형한다.
select  x.key,  x.fld1,  y.key,  y.col1,  y.col2
  from  tab1  x,  tab2  y
where  x.key  =  y.key(+)
and  x.fld1  >  ‘aaa’
and  (y.col1  =  10  or  y.col  is  null);

로  바꾸면  원하는  결과를  얻을  수  있다.  그러나  null이  있기  때문에  인덱스를  사용하지  못한다.  
<개선안>
select  x.key,  x.fld1,  y.key,  y.col1,  y.col2
from  tab1  x,  tab2  y
where  x.key  =  y.key(+)
and  x.fld1  >  ‘aaa’
and  y.col1(+)  =  10;

(+)기호가  붙지  않은  테이블부터  풀리게  되며  (+)기호가  붙은  쪽  테이블의  모든  컬럼에  (+)기호를  붙여  주어야  한다.  왜냐하면  (+)기호가  붙은  쪽의  컬럼에  의해  걸러져  버리기  때문이다.

&#61482;  Outer  join에서  in의  사용  
In  연산자는  아우터  조인에서  사용하지  못하므로  다음과  같이  In-Line  View를  사용하여  변형한다.

예)  select  x.key,  x.fld1,  y.key,  y.col1,  y.col2
from    tab1  x,  tab2  y
where  x.key  =  y.key(+)
and  x.fld1  >  ‘aaa’
and  y.col1(+)  in  (10,30,50);
은  사용되지  못한다.  (in,  between,  like,  or연산자는  아우터조인과  사용하지  못함)
  
<해결안>
select  x.key,  x.fld1,  y.key,  y.col1,  y.col2
from  tab1  x,  (select  key,  col1,  col2
                                          from  tab2  
                                          where  col1  in  (10,30,50))  y  
where  x.key  =  y.key(+)
and  x.fld1  >  ‘aaa’;

614 view

4.0 stars