본문 바로가기

SQL

SQL [12] - SELF JOIN

조인되는 테이블이 같은 경우를 SELF JOIN이라고 합니다.

테이블 명에 반드시 알리아스(별명)을 지정해야 합니다. (같은 테이블이라서 구문 내에서 구분해주어야 합니다.)

조회되는 모든 컬럼도 테이블의 별명을 붙여야 합니다. 

 

예제들을 보며 셀프 조인의 적용 사례를 확인해봅니다

 

-- Quiz. dept2 테이블에서 부서코드와 상위부서코드, 부서명 그리고 상위부서명을 출력하기
-- 단 모든 부서가 나와야함

 

select * from dept2;

dept2의 테이블의 DCDOE는 부서 코드, PDEPT는 해당 부서의 상위 부서의 부서 코드를 뜻합니다. 

우리가 원하는 결과 값은, DNAME(부서명)에 해당하는 상위 부서의 이름을 재 출력하여 조회하는 것이기 때문에, 

PDEPT를 이용하여 해당하는 DCODE를 조회하고 그에 맞는 부서를 기존 테이블에 붙여주어야 합니다. 

 

즉, 위의 표에서 2행의 경영지원부의 부서코드는 DCODE는 1000 / 상위부서코드는 PDEPT 는 0001입니다. 

따라서 복사된 같은 테이블에서 PDEPT에 해당하는 부서명을 출력하면 상위부서명이됩니다. 

즉, [1000/0001/경영지원부/사장실]과 같은 데이터가 출력되어야 합니다.

 

select d1.dcode, d1.pdept, d1.dname, d2.dname "상위부서명"

from dept2 d1, dept2 d2 -- 테이블 뒤에 별칭을 설정하고 테이블.컬럼은 해당하는 테이블의 특정 컬럼을 조회 기능

where d1.pdept = d2.dcode (+)

-- 교수 테이블에서 교수번호, 교수이름, 입사일, 자신보다 일사일이 빠른사람의 인원수를 출력하기

-- 입사일이 빠른순으로 정렬하기

select * from professor;

--오라클

select p1.name, p1.profno, p1.hiredate, count(p2.name) "인원수"

from professor p1, professor p2

where p1.hiredate > p2.hiredate

group by p1.name, p1.profno, p1.hiredate

order by p1.hiredate asc ;

 

--ANSI

select p1.name, p1.profno, p1.hiredate, count(p2.name) "인원수"

from professor p1 left outer join professor p2

on p1.hiredate > p2.hiredate

group by p1.name, p1.profno, p1.hiredate

order by p1.hiredate asc ;