[Oracle] 두 개이상의 테이블을 외부조인 하는 방법

     

    수업시간 실습문제 5

    04_DML(SELECT)_JOIN_KH계정.sql

     

     

    보너스를 받는 직원들의 사원명, 보너스, 연봉, 부서명, 근무지역명을 조회하시오

     

     

    <내 코드>

    SELECT EMP_NAME, BONUS, SALARY, DEPT_TITLE,LOCAL_NAME
    FROM EMPLOYEE, DEPARTMENT,LOCATION
    WHERE DEPT_CODE = DEPT_ID
    AND LOCATION_ID = LOCAL_CODE
    AND BONUS IS NOT NULL;
    
    

    [결과값] 

    더보기


    선동일 0.3 8000000 총무부 ASIA1
    유재식 0.2 3400000 해외영업2부 ASIA3
    하이유 0.1 2200000 해외영업1부 ASIA2
    심봉선 0.15 3500000 해외영업1부 ASIA2
    장쯔위 0.25 2550000 기술지원부 EU
    차태연 0.2 2780000 인사관리부 ASIA1
    전지연 0.3 3660000 인사관리부 ASIA1
    이태림 0.35 2436240 기술지원부 EU

     

    문제점

    하동운 사원의 결과가 조회되지 않았다.

    왜냐면, 하동운 사원은 부서명과 근무지역명이 null이기 때문이다. 

    따라서 우리는 사원을 기준으로 한 외부조인을 해야한다. 

     

     

    해결방법

    [복습] 외부조인 하는 방법 => 기준으로 삼고자하는 테이블의 반대편 테이블의 컬럼에 (+)를 붙인다.

    위의 경우, 부서명과 근무지역명을 모두 출력해야하기 때문에 DEPT_ID 와 LOCAL_CODE에 (+)를 붙여 

    외부 조인을 해준다. 

     

     

     

     

    <모범답안>

    	SELECT EMP_NAME 사원명, BONUS 보너스, SALARY*12 연봉, 
        	DEPT_TITLE 부서명, LOCAL_NAME 근무지역명
    	FROM EMPLOYEE E, DEPARTMENT D, LOCATION L
    	WHERE E.DEPT_CODE = D.DEPT_ID(+)
     	AND D.LOCATION_ID = L.LOCAL_CODE(+)
     	AND BONUS IS NOT NULL;

     

    [결과값]

    더보기

    선동일 0.3 96000000 총무부 ASIA1
    차태연 0.2 33360000 인사관리부 ASIA1
    전지연 0.3 43920000 인사관리부 ASIA1
    하이유 0.1 26400000 해외영업1부 ASIA2
    심봉선 0.15 42000000 해외영업1부 ASIA2
    유재식 0.2 40800000 해외영업2부 ASIA3
    장쯔위 0.25 30600000 기술지원부 EU
    이태림 0.35 29234880 기술지원부 EU
    하동운 0.1 27840000 (null) (null)

     

     

     


    실험

    (+)의 위치를 바꿔서 기술한다면 어떤 결과가 생길까?

     

    1. DEPT_CODE에 (+) 기술해보기

    WHERE DEPT_CODE(+) = DEPT_ID
    AND LOCATION_ID  = LOCAL_CODE (+)

    [결과값] => 실패

    더보기

    선동일 0.3 8000000 총무부 ASIA1
    차태연 0.2 2780000 인사관리부 ASIA1
    전지연 0.3 3660000 인사관리부 ASIA1
    하이유 0.1 2200000 해외영업1부 ASIA2
    심봉선 0.15 3500000 해외영업1부 ASIA2
    유재식 0.2 3400000 해외영업2부 ASIA3
    장쯔위 0.25 2550000 기술지원부 EU
    이태림 0.35 2436240 기술지원부 EU

     

     

    => DEPT_CODE 에 (+) 를 붙여서 기술한다면, EMPLOYEE 기준이 아닌, 부서 (DEPARTMENT) 기준이 된다. 

    따라서 처음의 결과값인 8개의 행이 조회횐다. 하동운 사원이 보이지 않음... . . .

     

     

    2. DEPT_CODE 와 LOCATION_ID에 기술해보기

    WHERE DEPT_CODE(+) = DEPT_ID
    AND LOCATION_ID (+) = LOCAL_CODE 
    

     

    [결과값] => 실패

    상동.

     

     

    3. LOCATION_ID에 기술해보기

    WHERE DEPT_CODE = DEPT_ID (+)
    AND LOCATION_ID (+) = LOCAL_CODE 

     

    [결과값] => 오류

    a table may be outer joined to at most one other table

    => 테이블은 최대 한 테이블과 연결될 수 있다

     

    즉, DEPT_ID (+) 한다면 EMPLOYEE 테이블과, LOCAL_ID(+)를 한다면, LOCATION 테이블에서 외부 조인이 되기 때문에, 정상적으로 출력되지 않는다는 문구가 발생한다. 

     

     

     

    실험 결과

     

    외부 조인은 한 개의 테이블에서만 가능하다. 위의 경우 EMPLOYEE 테이블과 , LOCATION 테이블의 교집합인 DEPARTMENT 테이블에서만 ! 외부 조인이 가능하다는 것을 알 수 있었음. 

     

    728x90

    댓글