3.1. 방사형 조인의 문제점

(문제) 10번부서의 사원별 3개월 급여합계 및 가족수를 구해보자

{section}
{column}

  • emp
nonmdept
11마농10
22구니10
33다솜10

{column}
{column}

  • fam
nofam_nofam_nm
111마누라
221와이프
222아들

{column}
{column}

  • gub
noymsal
11200901100
11200902100
11200903100
22200901200
22200902200
22200903200
33200901300
33200902300
33200903300

{column}
{column}

  • 최종결과
nonmsalfam
11마농3001
22구니6002
33다솜9000

{column}
{column:width=40%}
{column}
{section}

{section}
{column}

  • 단순 조인

SELECT e.no, e.nm, SUM(sal) sal, COUNT(f.no) fam
  FROM emp e, fam f, gub g
 WHERE e.no = f.no(+)
   AND e.no = g.no(+)
   AND e.dept = 10
   AND g.ym(+) BETWEEN '200901' AND '200903'
 GROUP BY e.no, e.nm
;

{column}
{column}

  • 결과
nonmsalfam
11마농3003
22구니12006
33다솜9000

{column}
{column:width=45%}
{column}
{section}

  • (1 : M) 조인 과 (1 : N) 조인 각각은 문제가 없다.
  • 하지만 두 결과집합을 조인하게 되면 원치않는 데이터 복제가 발생된다.

3.2. 인라인뷰를 이용한 해결

{section}
{column}

  • M의 집합을 조인키로 그룹바이 한후 1 : 1 조인

SELECT e.no, e.nm, g.sal, f.fam
  FROM emp e
     , (SELECT no, COUNT(*) fam
          FROM fam
         GROUP BY no
        ) f
     , (SELECT no, SUM(sal) sal
          FROM gub
         WHERE ym BETWEEN '200901' AND '200903'
         GROUP BY no
        ) g
 WHERE e.no = f.no(+)
   AND e.no = g.no(+)
   AND e.dept = 10
;

{column}
{column}

  • 결과
nonmsalfam
11마농3001
22구니6002
33다솜900

{column}
{column:width=45%}
{column}
{section}

  • 결과 자료에는 아무런 문제가 없다
  • 하지만 처리 절차에 문제점이 있다.
  • 처리범위를 줄여주는 조건인 10번부서 조건이
    Group by 절 안으로 파고들 수 없다.
  • 가족과 급여는 전체 부서를 대상으로 Group by 후
    대다수의 사원정보가 버려지게 된다.

3.3. 스칼라 서브쿼리를 이용한 해결

{section}
{column}

  • 처리 대상을 줄인 후 Group by

SELECT e.no, e.nm
     , (SELECT SUM(sal)
          FROM gub
         WHERE ym BETWEEN '200901' AND '200903'
           AND no = e.no
        ) sal
     , (SELECT COUNT(*)
          FROM fam
         WHERE no = e.no
        ) fam
  FROM emp e
 WHERE e.dept = 10
;

{column}
{column}

  • 결과
nonmsalfam
11마농3001
22구니6002
33다솜9000

{column}
{column:width=45%}
{column}
{section}

About Doc.

  • 최초작성자 : 기민용
  • 최초작성일 : 2009년 5월 15일
  • 이 문서는 오라클클럽 대용량 데이터베이스 스터디 모임에서 작성하였습니다.
  • {*}이 문서의 내용은 이화식님의 대용량 데이터베이스 솔루션2를 참고했습니다.*