http://korea.internet.com/channel/content.asp?cid=436&nid=22225
[엔코아 유경진 담당]관계형 데이터베이스에서 효율적인 데이터연결 - OuterJoin의 원리 및 활용방안
이라는 내용으로 해당 링크에 outer join에 대한 내용이 자세히 나와있음
SELECT *
FROM test_table1 t1 FULL OUTER JOIN test_table2 t2
ON t1.field1 = t2.field1
4.2 Oracle 9i 에서 Full Outer Join 사용하기
Full Outer Join을 각각 다른 방향으로 Outer Join을 한 후 union을 하면 같은 집합을 2번 읽어야 하는 비효율과 union 하면서 생기는 sort의 부하가 있다. Oracle 9i부터는 Full Outer Join이라는 ANSI 표준 SQL이 지원된다.
위의 쿼리를 Full Outer로 변경하면 다음과 같다.
ANSI 표준 SQL을 사용하는 Full Outer Join에는 On절과 Where절에 각각 상수조건에 들어 갈 수 있다.
1) On절에 상수조건이 있는 경우
위와 같이 On 절에 상수조건이 들어와 Full Outer Join을 하는 경우 emp 테이블에 deptno가 40인 사원만 dname과 deptno 값이 들어오고 나머지 deptno를 갖는 emp테이블의 값들은 null값으로 매치된다.
Dept테이블 역시 40이외에 다른 deptno로 매치되는 emp에 값이 존재하더라도 D.DEPTNO = 40 조건 때문에 emp쪽 컬럼 값들이 null로 매치가 된다.
On절에 상수조건이 있는 경우 조인조건으로 사용되는걸 알 수 있다.
2) Where에 상수조건이 있는 경우
where절에 조건에 있는 경우는 일반적인 Outer Join에서와 마찬가지로 조인후 걸러지는 체크 조건 값으로 사용된다.
위 쿼리는 full outer join후 다시 deptno가 40이거나 emp가 가지고 있는 deptno가 dept에 없는 데이터를 결과로 낸다. 여기서 is null 조건을 빼는 경우 d.deptno= 40만 가지고 equal join한 결과와 같은 값을 내므로 is null이 없는 경우 outer join에서 (+)기호를 생략한 결과와 같다고 할 수 있다.
또한 where d.deptnp(+) = 40 로 사용한 경우 ORA-25156: 이전 방식의 포괄조인(+)은 ANSI 조인과 함께 사용할 수 없음 이라는 에러 메시지가 나오므로 주의해야 한다.
이상으로 Outer Join의 원리와 활용방안에 대해서 알아보았다. 다음 연재는 단계별 데이터의 연결방법에 대해서 알아볼 것이다.