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
'🚨 Error > ORACLE' 카테고리의 다른 글
[Oracle] FINALWORKSHOP (6) 오답 정리 (0) | 2021.03.22 |
---|---|
[Oracle] 주민등록번호(CHAR)를 활용하여 학생의 입학 당시의 나이 확인 (0) | 2021.03.16 |
[Oracle] 두 개이상의 테이블을 외부조인 하는 방법 (0) | 2021.03.12 |
[Oracle] 같은 문제에 DECODE 와 CASE WHEN THEN 적용해보기 (0) | 2021.03.09 |
[Oracle] 데이터 테이블에서 이메일 전체 조회가 아닌 아이디만 조회하고 싶을 때 (0) | 2021.03.07 |
댓글