Oracle OUTER JOIN 정리 1

Updated:

예제 테이블 생성

샘플 테이블 생성

- FULLOUTER1 테이블
ID     NAME
------------
1001	박무영
1002	이무영
1003	김지미
1004	이연희
1005	최무룡

- FULLOUTER2 테이블
ID     NAME
-------------
1001	박무영
1002	이무영
1009	고아라
1010	소녀시대
1015	2PM

1. 오라클 LEFT OUTER JOIN 기본 개념

OUTER JOIN이란 두 테이블을 조인할 경우 조인 컬럼의 값이 NULL인 데이터도 결과에 포함하는 조인방법입니다. 종류로는 LEFT OUTER JOIN. RIGHT OUTER JOIN, FULL OUTER JOIN이 있습니다. 위의 두 예제 테이블을 살펴보면 ID 가 PK인데 2개의 테이블을 일반적인 조인을 하게되면 ID가 1001, 1002인 2개의 레코드만 조회됩니다. 그런데 개발자가 1번 테이블은 2번에 조인되는 값이 없더라도 다 가져오고 2번 테이블은 조인되는 값만 가져오고 싶을때 사용하는것이 LEFT OUTER JOIN 입니다.


- 일반조인
SELECT A.ID, B.ID, A.NAME, B.NAME
FROM FULLOUTER1 A, FULLOUTER2 B
WHERE A.ID=B.ID;

A.ID B.ID A.NAME B.NAME
1001 1001 박무영 박무영
1002 1002 이무영 이무영
  • LEFT OUTER JOIN : 오라클은 (+)를 사용하여 OUTER조인을 표시합니다.
    아래예는 A 테이블 데이타는 전부 가져오고 B 테이블의 데이타는 A 테이블과 조인되는 값만 가져오는 SQL입니다. ANSI SQL은 LEFT OUTER JOIN이라 합니다. (+) 기호를 기준 테이블인 A에 붙이지 않고 B에 붙였습니다.

 SELECT A.ID, B.ID, A.NAME, B.NAME
 FROM FULLOUTER1 A,  FULLOUTER2 B
 WHERE A.ID=B.ID(+);

A.ID B.ID A.NAME B.NAME
1001 1001 박무영 박무영
1002 1002 이무영 이무영
1005   최무룡  
1003   김지미  
1004   이연희  

2. 오라클 RIGHT OUTER JOIN 기본 개념

이번에는 B 테이블을 기준으로 B 테이블은 전부 가져오고 A 테이블은 조인되는 레코드만 가져오는 RIGHT OUTER JOIN 입니다.

- RIGHT OUTER JOIN : B 테이블 데이타는 전부 가져오고 A 테이블의 데이타는 B 테이블과 조인되는 
  값만 가져오는 SQL입니다. ANSI SQL은 RIGHT OUTER JOIN이라 합니다. (+) 기호를 기준 테이블인 B에 붙이지 않고 A에 붙였습니다.

SELECT A.ID,B.ID,A.NAME,B.NAME
FROM FULLOUTER1 A,   FULLOUTER2 B
WHERE A.ID(+)=B.ID;

A.ID B.ID A.NAME B.NAME
1001 1001 박무영 박무영
1002 1002 이무영 이무영
  1010   소녀시대
  1015   2PM
  1009   고아라

3. 오라클 FULL OUTER JOIN 기본 개념

오라클은 FULL OUTER JOIN을 ANSI SQL 형태로 지원하고 (+) 표시로는 지원하지 않는다. 양쪽에 (+) 표시를 하면 에러가 발생합니다. 굳이 (+)를 양쪽에 하지않아도 FULL OUTER JOIN을 만들수 있는 방법이 있습니다. 그리고 오라클 DBMS에서도 ANSI SQL을 지원하므로 FULL OUTER 문구로 조인을 하면 됩니다.

- FULL OUTER JOIN 수행. A테이블기준으로, B테이블 기준으로 OUTER조인을 각각수행함
SELECT A.ID,B.ID,A.NAME,B.NAME
FROM FULLOUTER1 A FULL OUTER JOIN  FULLOUTER2 B
ON A.ID = B.ID;

A.ID B.ID A.NAME B.NAME
1001 1001 박무영 박무영
1002 1002 이무영 이무영
  1009   고아라
  1010   소녀시대
  1015   2PM
1005   최무룡  
1003   김지미  
1004   이연희  
- A.ID, B.ID를 보기좋게 통합
SELECT  (CASE WHEN A.ID IS NOT NULL THEN A.ID    
             ELSE B.ID END) AS ID, A.NAME,B.NAME
FROM FULLOUTER1 A FULL OUTER JOIN FULLOUTER2 B
ON A.ID = B.ID
ORDER BY 1;

ID A.NAME B.NAME
1001 박무영 박무영
1002 이무영 이무영
1003 김지미  
1004 이연희  
1005 최무룡  
1009   고아라
1010   소녀시대
1015   2PM

4. 오라클 OUTER JOIN 제한사항

오라클은 ANSI 표준SQL 형태와 오라클 독점표시인 (+) 기호등 2가지 형태로 OUTER JOIN을 사용할수 있습니다. (+) 기호를 사용할때 주의점은 아래와 같습니다.

가. 조인조건과 일반조건 모두 (+) 기호를 붙여야 합니다. 하나라도 빠지게 되면 오라클 내부적으로 일반조인으로 변경하여 처리합니다. 

SELECT e1.ename,e2.ename 
FROM emp e1, emp e2
WHERE e1.mgr = e2.empno(+)
AND e2.deptno = 20;        <--(+) 기호가 생략됨.

나. 10G 버젼 DBMS 제한 : IN, OR절을 사용할수 없다. 11G부터 가능함.

SELECT e1.ename,e2.ename 
FROM emp e1, emp e2
WHERE e1.mgr = e2.empno(+)
AND e2.deptno(+) in (10, 20)  <--IN절 사용하여 에러 발생함.

ORA-01719: 포괄 조인 운영 (+)는 OR 또는 IN의 연산수를 허용하지 않습니다.

다. 조인 조건의 한쪽에만 (+) 기호를 붙일 수 있음.

SELECT e1.ename,e2.ename 
FROM emp e1, emp e2
WHERE e1.mgr(+) = e2.empno(+); <--양쪽에 (+) 기호 표시하여 에러발생

ORA-01468: outer-join된 테이블은 1개만 지정할 수 있습니다.

5. 결언

OUTER JOIN 기능은 모든 RDBMS에서 많이 지원하는 표준기능이며 오라클에서는 독점표시인 (+) 기호와 ANSI SQL을 사용하여 표현할수 있습니다. OUTER JOIN 개념은 개발자가 필수적으로 알고있어야 할 내용입니다. 다음 포스팅에서 OUTER JOIN과 여러가지 SQL형태를 비교하여 어떤 형태가 가장 좋은 성능을 낼수 있는지 알아보도록 합니다.