[Oracle] 비등가 조인을 활용하여 문제 풀기

     

     

     

     

     9. 사번, 사원명, 직급명, 급여등급, 구분을 조회하는데
       이때 구분에 해당하는 값은
       급여등급이 S1, S2인 경우 '고급'
       급여등급이 S3, S4인 경우 '중급'
       급여등급이 S5, S6인 경우 '초급' 으로 조회되게 하시오.

     

    SELECT EMP_ID, EMP_NAME, DEPT_TITLE,SAL_LEVEL,
    CASE WHEN SAL_LEVEL IN ('S1','S2') THEN '고급'
    WHEN SAL_LEVEL IN ('S3','S4') THEN '중급'
    ELSE '초급'
    END "급여등급"
    FROM EMPLOYEE
    JOIN DEPARTMENT ON DEPT_CODE = DEPT_ID
    JOIN SAL_GRADE ON ( SALARY BETWEEN MIN_SAL AND MAX_SAL);

     

    문제점

    1. DEPT_CODE 가 NULL인 이오리 사원 하동운 사원이 조회되지 않는다. 

    2. 직급명을 조회해야하는데, 부서명을 조회함.

    3. 초급의 범위를 지정하지 않았음 

     

     

     

     

    해결방법

    비등가 조인구문을 활용해서 문제를 푼다.

     

     

    비등가 조인구문이란?

    더보기

    '=' (등호)를 사용하지 않는 조인문 지정한 컬럼값이 일치하는 경우가 아닌, 값의 "범위"에 포함되는 경우 매칭

    JOIN ON 구문으로만 사용할 수 있다. 왜? USING처럼 동등한 것들을 비교할 사용할 수 없으니까 !

     

    왜? 비등가 조인구문을 사용해야하는가? 

    SAL_LEVEL이라는 컬럼은 SAL_GRADE라는 테이블에 속해있다. 이때 SAL_GRADE에 담긴 값은 범위로서 제시되는데, 

    S1등급의 최대급여, 최소급여로 담겨있는 상태이다. 따라서 일반적인 JOIN은 등가조인 ( EQUAL ) 조인이기 때문에, 사용이 불가하다. 이때 비등가 조인 ( == 값의 범위에 포함되는 경우 매칭시켜주는 조인) 을 통해서 문제를 해결할 수 있다. 

     

     

     

    <모범답안>

    SELECT EMP_ID 사번, EMP_NAME 사원명, JOB_NAME 직급명, SAL_LEVEL 급여등급,
    CASE WHEN SAL_LEVEL IN ('S1', 'S2') THEN '고급'
    WHEN SAL_LEVEL IN ('S3', 'S4') THEN '중급'
    WHEN SAL_LEVEL IN ('S5', 'S6') THEN '초급'
    END 구분
    FROM EMPLOYEE E
    JOIN JOB J ON(E.JOB_CODE = J.JOB_CODE)
    JOIN SAL_GRADE S ON(E.SALARY BETWEEN S.MIN_SAL AND S.MAX_SAL);

     

    [결과값]은 23행으로 전 사원이 조회된다. 

     

     


     

    이 결과값이 나오기까지의 TMI

     

     

    728x90

    댓글