삽질의 리포팅

4.4 조인(Join) – Outer Join(LEFT, RIGHT, FULL OUTER JOIN)

느린구름 2011. 7. 25. 17:17

오라클 클럽: http://www.oracleclub.com/lecture/1021

 

Outer(외부) Join

  • Equi Join 문장들의 한 가지 제약점은 그것들이 조인을 생성하려는 두 개의 테이블의 두 개 컬럼에서

    공통된 값이 없다면 테이블로부터 데이터 반환하지 못함

  • 정상적으로 조인 조건을 만족하지 못하는 행들을 보기 위해 Outer Join 사용
  • Outer Join연산자는 (+)
  • 조인시킬 값이 없는 조인 측에 (+)를 위치
  • Outer Join연산자는 표현식의 한 편에만 올 수 있음

 

Outer Join예제

-- 예제1) 일반 조인의 경우

SQL> SELECT DISTINCT(a.deptno), b.deptno

FROM emp a, dept b

WHERE a.deptno = b.deptno

 

DEPTNO DEPTNO

------ ----------

10 10

20 20

30 30

 

-- 예제2) Outer Join을 했을 경우

SQL> SELECT DISTINCT(a.deptno), b.deptno

FROM emp a, dept b

WHERE a.deptno(+) = b.deptno

 

DEPTNO DEPTNO

------- --------

10 10

20 20

30 30

40

 

-- 다음의 쿼리를 한번 잘 살펴보기 바란다.

SQL> SELECT DISTINCT(a.deptno), b.deptno

FROM emp a, dept b

WHERE a.deptno(+) = b.deptno

AND a.ename LIKE '%';

 

DEPTNO DEPTNO

---------- ----------

10 10

20 20

30 30

 

-- 쿼리 결과를 잘 보면 Outer Join이 되지 않은 것을 알 수 있다.

-- 위 쿼리를 Outer Join 시키기 위해서는 아래와 같이 고쳐야 한다.

SQL> SELECT DISTINCT(a.deptno), b.deptno

FROM emp a, dept b

WHERE a.deptno(+) = b.deptno

AND a.ename(+) LIKE '%'

 

DEPTNO DEPTNO

---------- ----------

10 10

20 20

30 30

40

 

-- Outer Join 조건이 걸려있는 테이블에는 다른 조건절이 들어와도

-- 똑같이 Outer Join 연산자인 (+)를 해주어야 한다.

 

표준 Outer Join

  • Oracle9i부터는 ANSI/ISO SQL표준인 LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN를 지원

 

LEFT OUTER JOIN

  • 오른쪽 테이블에 조인시킬 컬럼이 없는 경우 사용

SELECT DISTINCT(e.deptno), d.deptno

FROM dept d LEFT OUTER JOIN emp e

ON d.deptno = e.deptno;

 

RIGHT OUTER JOIN

  • 왼쪽 테이블에 조인시킬 컬럼의 값이 없는 경우 사용

SELECT DINSTINCT(e.deptno), d.deptno

FROM emp e RIGHT OUTER JOIN dept d

ON e.deptno = d.deptno;

 

FULL OUTER JOIN

  • 양쪽 테이블에 다 Outer Join을 거는 것을 TWO-WAY OUTER JOIN 또는 FULL OUTER JOIN

SELECT DISTINCT(a.deptno), b.deptno

FROM emp a FULL OUTER JOIN dept b

ON a.deptno = b.deptno