오늘의 실수 - 0504

한장민·2022년 5월 4일
0

오늘의실수

목록 보기
1/6
post-thumbnail

SQL문 다중JOIN을 이용하는 경우

>> 오늘의 실수
SELECT EMP_ID, EMP_NAME, DEPT_TITLE, JOB_NAME, HIRE_DATE, ((SALARY + SALARY * NVL(BONUS, 0)) * 12), RANK() OVER(ORDER BY ((SALARY + SALARY * NVL(BONUS, 0)) * 12)DESC) "순위"
FROM EMPLOYEE E, JOB J
JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID)
WHERE E.JOB_CODE = J.JOB_CODE;

>> 개선
SELECT EMP_ID, EMP_NAME, DEPT_TITLE, JOB_NAME, HIRE_DATE, ((SALARY + SALARY * NVL(BONUS, 0)) * 12), RANK() OVER(ORDER BY ((SALARY + SALARY * NVL(BONUS, 0)) * 12)DESC) "순위"
FROM EMPLOYEE E, DEPARTMENT, JOB J
WHERE DEPT_CODE = DEPT_ID
AND E.JOB_CODE = J.JOB_CODE;

EMPLOYEE와 JOB의 컬럼 이름이 같기 때문에 테이블의 별칭을 만들어 구분해준다.

다중으로 조인을 하는 경우인데 처음에 ORACLE의 방법과 ANSI의 방법을 혼용해서 사용하여 오류가 발생했다. ORACLE 방식으로 고쳐주었다.

>> 개선 ANSI
SELECT EMP_ID, EMP_NAME, DEPT_TITLE, JOB_NAME, HIRE_DATE, ((SALARY + SALARY * NVL(BONUS, 0)) * 12), RANK() OVER(ORDER BY ((SALARY + SALARY * NVL(BONUS, 0)) * 12)DESC) "순위"
FROM EMPLOYEE 
LEFT JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID)
JOIN JOB USING(JOB_CODE);

LEFT(RIGHT) OUTER JOIN : 포괄조인 / 외부조인
두 테이블 중 해당 방향의 테이블을 기준으로 JOIN한다. 일치하지 않아도 해당 방향의 테이블의 데이터는 무조건 조회하겠다.

JOIN ON / USING
연결할 두 컬럼의 이름이 다른 경우 ON을 사용한다.
연결할 두 컬럼의 이름이 같을 경우 USING을 사용한다.

profile
HAAN YJGB

0개의 댓글