수업시간 실습문제 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 테이블에서만 ! 외부 조인이 가능하다는 것을 알 수 있었음.
'🚨 Error > ORACLE' 카테고리의 다른 글
[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 |
[Oracle] WHERE절에서 와일드카드 기술하기 (0) | 2021.03.05 |
댓글