💡셀프 조인
셀프 조인(Self Join)은 1개의 테이블을 사용하는 조인이다.
셀프 조인은 자기 스스로와 관계를 맺는 경우를 의미한다. 즉, 똑같은 게 부모 자식이 된다.
- 다중 조인(2개) + 내부 조인
- 다중 조인(2개) + 외부 조인
- 셀프 조인(1개) + 내부 조인
- 셀프 조인(1개) + 외부 조인
셀프 조인은 아래의 항목에 해당한다.
셀프 조인의 사용
CREATE TABLE tblSelf (
seq NUMBER PRIMARY KEY, --직원번호(PK)
name varchar2(30) NOT NULL, --직원명
department varchar2(30) NOT NULL, --부서명
super NUMBER NULL REFERENCES tblSelf(seq) --상사번호(FK)
);
INSERT INTO tblSelf VALUES (1, '홍사장', '사장', null);
INSERT INTO tblSelf VALUES (2, '김부장', '영업부', 1);
INSERT INTO tblSelf VALUES (3, '박과장', '영업부', 2);
INSERT INTO tblSelf VALUES (4, '최대리', '영업부', 3);
INSERT INTO tblSelf VALUES (5, '정사원', '영업부', 4);
INSERT INTO tblSelf VALUES (6, '이부장', '개발부', 1);
INSERT INTO tblSelf VALUES (7, '하과장', '개발부', 6);
INSERT INTO tblSelf VALUES (8, '신과장', '개발부', 6);
INSERT INTO tblSelf VALUES (9, '황대리', '개발부', 7);
INSERT INTO tblSelf VALUES (10, '허사원', '개발부', 9);
COMMIT;
SELECT * FROM tblSelf;
직속상사를 나타내는 직원 테이블을 생성하였다.
super에 직속 상사를 저장한다. 직속 상사 또한 직원 중 한 명이므로 다른 사람의 시퀀스를 넣기로 한다.
이때도 똑같은 직원번호가 들어가는데, 다른 점은 상사의 번호라는 점이다.
셀프 테이블을 그림으로 그리면 이런 모양이 된다.
자기 자신을 참조하므로 화살표가 자신에게로 돌아온다.
💡직원 명단 가져오기
- 조인을 쓰는 방법
- 서브 쿼리를 쓰는 방법
- 계층형 쿼리를 쓰는 방법
직원 명단을 가져오려고 할 때, 위 3가지 방법을 사용할 수 있다.
먼저 조인을 사용하는 방법을 살펴보도록 하자.
조인을 쓰는 방법
셀프 조인과 내부 조인 사용
SELECT
b.name AS 직원명,
b.department AS 부서명,
b.name AS 상사명
FROM TBLSELF a --역할: 부모 테이블 > 상사
INNER JOIN TBLSELF b --역할: 자식 테이블 > 직원
ON a.seq = b.super;
내부 조인이므로 직속상사가 없는 홍사장을 제외하고 데이터가 출력되었다.
셀프 조인과 외부 조인 사용
SELECT
b.name AS 직원명,
b.department AS 부서명,
b.name AS 상사명
FROM TBLSELF a --역할: 부모 테이블 > 상사
RIGHT OUTER JOIN TBLSELF b --역할: 자식 테이블 > 직원
ON a.seq = b.super;
홍사장이 직원으로서 존재하기 때문에 부모 테이블이 아니라 자식 테이블을 외부 참조하여 가져왔다.
서브 쿼리를 쓰는 방법
SELECT
name AS 직원명,
department AS 부서명,
(SELECT name FROM tblSelf WHERE seq = a.super) AS 상사명
FROM tblSelf a;