Base/Database

[Database] Self JOIN 사용법 (ANSI 표준)

반응형

 

SELF JOIN 

같은 테이블을 조인하는 것을 말한다.

 

ERD를 봤을 때는 아래와 같이 재귀 느낌이라고 보면 된다.

 

 

-- 구문 ANSI
SELECT  *
FROM    컬럼 E
JOIN    컬럼 S ON (E.컬럼명 = S.컬럼명);

여기서 E와 S는 테이블에 대한 별칭을 나타냅니다.


-- 구문 ORACLE
SELECT  *
FROM    컬럼 E,컬럼 S
WHERE E.컬럼명 = S.컬럼명;

 

 

이건 USING을 쓸 수 없고  ON으로 조건 절을 줘야 한다. 

 

그 이유는 당연히 JOIN을 거는 USING은 부모 키와 자식 키 사이의 연관성이 있을 때 사용하는 것으로 헷갈린다면 그 JOIN 글을 보는 걸 추천합니다.

 

지금 위에 있는 쿼리는 ANSI 표준으로 FROM에서 EMPLOYEE 테이블이 나오는데 JOIN 부분에서도 EMPLOYEE가 나온다.

 

이렇게 자기 자신을 조인 걸어서 필요한 값들을 출력하는 데 사용할 수 있다.

 

위 같은 경우에는 직원과 관리자로 나타내기 위해 사용했다. 

 

사원 테이블에 매니저 ID라는 칼럼이 있다. 이 매니저 ID 칼럼과 사원의 번호가 같은 경우에 그 사원에 대한 관리자가

 

다른 사원이다. 그것을 여기서 출력해주기 위해 JOIN을 걸어서 나타냈다.

 

간단하게 매니저 번호 = 사원번호  해당 사원이 한 사원의  관리자라는 뜻을 나타낸다. 이런 식으로 재귀적으로 사용한다.

 

 

 

재귀재귀

여기서는 그 매니저를 관리하는 MGR_ID를 찾아 관리자의 관리자 즉 임원을 찾아낸다. 

 

SELF JOIN에 SELF JOIN을 사용했다.

 

 

이렇게 N개의 테이블을 조인하려면 최소 N-1개의 조인 조건이 필요하다.

 

JOIN을 두 번 거는 경우

 

 

 

6개의 테이블을 조인해서 값 가져오기

 

 

USING 은 각 테이블의 부모 키와 자식 키 연관성이 있어 키만 넣어주면 된다.

ON은 연관성이 없을 때 사용하는 걸로 

 

이렇게 여러 개를 조인할 때는 차례대로 해야 한다. JOIN으로 테이블은 병합되는 것이므로 테이블의 순서에 

 

맞춰서 하지 않는다면 인식하지 못할 수 있다. 예를 들어 EMPLOYEE와 JOB을 JOIN 한 다음에 COUNTRY 조인한다면 

 

해당 JOIN은 인식하지 못해 에러가 난다. 조인을 할 때는 연관이 있는 걸로 차례차례 해야 한다.

 

반응형