Programming/Oracle

[Oracle] 조인: 셀프 조인 (Self Join)

Isaac S. Lee 2023. 9. 1. 11:40

💡셀프 조인


셀프 조인(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에 직속 상사를 저장한다. 직속 상사 또한 직원 중 한 명이므로 다른 사람의 시퀀스를 넣기로 한다.
이때도 똑같은 직원번호가 들어가는데, 다른 점은 상사의 번호라는 점이다.

셀프 테이블을 그림으로 그리면 이런 모양이 된다.

자기 자신을 참조하므로 화살표가 자신에게로 돌아온다.

 

💡직원 명단 가져오기


  1. 조인을 쓰는 방법
  2. 서브 쿼리를 쓰는 방법
  3. 계층형 쿼리를 쓰는 방법

직원 명단을 가져오려고 할 때, 위 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;