Oracle OUTER JOIN
========================================================================================
전체사원의 이름과 부서명을 출력하려면 EMP, DEPT 테이블을 연결해야 한다.
다음과 같은 문장은 전체 사원의 이름과 부서명을 충실하게 출력해 주고 있다.
그러나 현재 사원이 없는 부서(40번부서)일지라도 부서명은 출력되도록 해야 한다면,
아래의 문장만으로는 부족함이 있다.
========================================================================================
SQL> select e.ename, d.dname
2 from emp e, dept d
3 where e.deptno=d.deptno;
ENAME DNAME
---------- --------------
SMITH RESEARCH
ALLEN SALES
WARD SALES
JONES RESEARCH
MARTIN SALES
BLAKE SALES
CLARK ACCOUNTING
SCOTT RESEARCH
KING ACCOUNTING
TURNER SALES
ADAMS RESEARCH
JAMES SALES
FORD RESEARCH
MILLER ACCOUNTING
14 개의 행이 선택되었습니다.
========================================================================================
DEPT 테이블에는 40번 부서정보도 있지만 EMP 테이블에는 40부서의 직원이 없다.
그러므로 모든 사원의 부서명을 출력할 때는 마치 40번 부서의 존재조차도 없는 것처럼 보일 수 있다.
그래서 직원이 없는 부서라 할지라도 그 부서의 정보가 출력되도록 하려면, 즉 연결조건에
합치되지 않더라도 DEPT테이블의 모든 부서정보 레코드가 출력되도록 하려면,
WHERE절의 모든 EMP 조건에 (+)붙어서 OUTER JOIN을 작성하면 된다.
========================================================================================
SQL> select e.ename, d.dname
2 from emp e, dept d
3 where e.deptno(+)=d.deptno;
ENAME DNAME
---------- --------------
CLARK ACCOUNTING
KING ACCOUNTING
MILLER ACCOUNTING
JONES RESEARCH
FORD RESEARCH
ADAMS RESEARCH
SMITH RESEARCH
SCOTT RESEARCH
WARD SALES
TURNER SALES
ALLEN SALES
JAMES SALES
BLAKE SALES
MARTIN SALES
OPERATIONS
15 개의 행이 선택되었습니다.
========================================================================================
전체 사원(14명)의 이름과 해당 사원의 매니저 이름을 출력하기 위해서 self join을 이용할 경우,
다음과 같은 문장은 14명이 아니라 13명의 사원정보만 출력하고 있다.
========================================================================================
SQL> select e.ename"사원", m.ename"매니저"
2 from emp e, emp m
3 where e.mgr=m.empno;
사원 매니저
---------- ----------
SMITH FORD
ALLEN BLAKE
WARD BLAKE
JONES KING
MARTIN BLAKE
BLAKE KING
CLARK KING
SCOTT JONES
TURNER BLAKE
ADAMS SCOTT
JAMES BLAKE
FORD JONES
MILLER CLARK
13 개의 행이 선택되었습니다.
========================================================================================
KING을 포함하여 전체 14명의 사원을 대상으로 위의 정보를 출력하기 위해서는 OUTER JOIN을
이용해야 하고, 전체 레코드를 출력하려는 상대방 테이블에 WHERE 절의 모든 조건에 (+) 를 붙여준다
아래에는 e 테이블의 모든 레코드가 출력되어야 하므로 그 상대방인 m 테이블의 WHERE 절 조건에
모두 (+)를 붙여주면 KING에 대한 정보도 출력된다.
========================================================================================
SQL> select e.ename, m.ename
2 from emp e, emp m
3 where e.mgr=m.empno(+);
ENAME ENAME
---------- ----------
SMITH FORD
ALLEN BLAKE
WARD BLAKE
JONES KING
MARTIN BLAKE
BLAKE KING
CLARK KING
SCOTT JONES
KING
TURNER BLAKE
ADAMS SCOTT
JAMES BLAKE
FORD JONES
MILLER CLARK
14 개의 행이 선택되었습니다.