본문 바로가기

컴퓨터공학/데이터베이스

오라클> Left outer join 예시

LEFT OUTER JOIN은 언제 사용할까???

LEFT OUTER JOIN은 기반 테이블를 살리면서 조건에 해당하는 정보를 다른 테이블에서 가져와 붙이거나

정보가 없으면 null로 표현하고 싶을 때 사용한다.

 

 


 

테이블 2개 예시

오늘의 준비물1이다. 

 

LEFT OUTER JOIN 1개일 때

(+)의 의미는 LEFT OUTER JOIN  표시이다.

오라클 쿼리 표기법이므로 ANSI 표기문을 알아두자.

ANSI 표기법은 
테이블1 left join 테이블2
on  테이블1 조건 = 테이블2 조건

이런 형식이다. 

 

이렇게 나오는데

order by를 겁나 건다 

 

이해하기 쉽게 표현 완료 

 

 

LEFT OUTER JOIN 순서 변경하면?

만약 outer 대상 순서를 바꾸면

 

이런 형식으로 나온다. 

 

LEFT OUTER JOIN 2개일 때

 

3개일 때도 보자

LEFT OUTER JOIN 3개일 때

 

test2 테이블 칼럼 4개(col1,col2,col3,col4) 중에서

test1 테이블과 left outer join 조건이 1개든 2개든 3개든

일치하는 조건 말고 남은 칼럼 값에서 종류가 다른 값이 존재하면

종류 별로 모두 표시해야 하니 왼쪽 테이블 행 수가 늘어나서 표시한다

 

실황에서 보통 하나의 테이블을 기반으로 여러 테이블에서 정보를 가지고 와 합쳐서 필요 정보를 표시한다. 

근데 기본이 되는 테이블에서 행 수가 늘어나 중복 표시되면 좋지 않다. 

 

위 테스트로 조건을 많이 걸면 늘어나지 않는다는 걸 배웠다.

조건 정보를 많이 걸자 

 


 테이블 3개 예시

준비물2

 

이렇게 했을 경우

상상하기로는 test3 테이블과 test5 테이블이 연결돼서

이 결과를 상상하겠지만 아쉽게도

 

 

이렇게 나온다.

왜냐하면 중간에 다른 테이블(test4)을 불렀기 때문에 그것도 같이 표시하기 위해

이런 모습이 나온 것.

우리가 원하는 모습을 출력하려면 

 

중간 테이블을 빼야지

이렇게 나온다. 

하지만

 

조건 :

test3 테이블에 있는 ID에 나눠준 코드 번호 정보는 test5에 있으니 거기서 갖고 오고

코드 번호에 따른 이름은 test4에서 가져와.

즉, ID에 배정한 코드 정보와 이름을 한 테이블에 보여줘!

아 근데 test3에서 dep 가 eco인 놈은 빼줬으면 좋겠고,

test3에서 dep가 com인 놈과 test5에서 코드를 배정받지 못해도 표현해서 보여줘!

 

 

이런 경우 test4 정보가 필요해서 빼면 안된다.

 

 

이렇게 하거나

아님 이렇게 하는 건데

3개 중에서 2개를 서브쿼리로 합치고 나머지 한개와 비교하는 방법인데

이 방법으로 

ORA-01417: 하나의 테이블은 하나의 다른 테이블과 포괄 조인할 수 있습니다

이 오류를 해결할 수 있다.

 

대충 이렇게 코드를 쓰면 위 오류가 뜬다.