: 같은 테이블을 조인 (자기 자신과 조인을 맺음)
TIP! 같은 테이블 2개 있다고 생각하고 JOIN을 진행
-- 사번, 이름, 사수의 사번, 사수 이름 조회
ANSI
SELECT E1.EMP_ID, E1.EMP_NAME,
NVL(E1.MANAGER_ID, '없음'), NVL(E2.EMP_NAME, '-')
FROM EMPLOYEE E1
LEFT JOIN EMPLOYEE E2 ON(E1.MANAGER_ID = E2.EMP_ID);
오라클
SELECT E1.EMP_ID, E1.EMP_NAME,
NVL(E1.MANAGER_ID, '없음'), NVL(E2.EMP_NAME, '-')
FROM EMPLOYEE E1, EMPLOYEE E2
WHERE E1.MANAGER_ID = E2.EMP_ID(+);
: 동일한 타입과 이름을 가진 컬럼이 있는 테이블 간의 조인을 간단히 표현하는 방법
: 반드시 두 테이블 간의 동일한 컬럼명, 타입을 가진 컬럼이 필요
--> 없을 경우 교차조인이 됨.
SELECT EMP_NAME, JOB_NAME
FROM EMPLOYEE
--JOIN JOB USING(JOB_CODE);
NATURAL JOIN JOB;
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE
NATURAL JOIN DEPARTMENT;
--> 잘못 조인하면 CROSS JOIN 결과 조회
: N개의 테이블을 조회할 때 사용 (순서 중요!)
-- 사원이름, 부서명, 지역명 조회
--> EMPLOYEE, DEPARTMENT, LOCATION
ANSI
SELECT EMP_NAME, DEPT_TITLE, LOCAL_NAME
FROM EMPLOYEE
JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID)
JOIN LOCATION ON(LOCATION_ID = LOCAL_CODE);
--> JOIN은 위에서 아래로 차례대로 진행하는데
--> 다중조인 시 앞에서 조인된 결과에 새로운 테이블 내용을 조인
SELECT *
FROM EMPLOYEE
JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID)
JOIN LOCATION ON(LOCATION_ID = LOCAL_CODE);
-- 순서 오류!
SELECT *
FROM EMPLOYEE
JOIN LOCATION ON(LOCATION_ID = LOCAL_CODE)
JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID);
-- SQL Error [904][42000]: ORA-00904: "LOCATION_ID": 부적합한 식별자
--> EMPLOYEE 테이블에 LOCATION_ID 컬럼이 없어서 오류 발생
--> 해결 방법: DEPARTMENT와 LOCATION 조인 순서를 바꿔서
-- EMPLOYEE와 DEPARTMENT가 조인된 결과를 먼저 만들어
-- LOCATION_ID 컬럼이 존재할 수 있도록 만든다!
오라클
SELECT EMP_NAME, DEPT_TITLE, LOCAL_NAME
FROM EMPLOYEE, DEPARMENT, LOCATION
WHERE DEPT_CODE = DEPT_ID -- EMPLOYEE + DEPARTMENT 조인
AND LOCATION_ID = LOCAL_CODE; -- (EMPLOYEE + DEPARTMENT) + LOCATION 조인
-- 조인 순서를 지키지 않은 경우(에러 발생)