Oracle/Oracle OUTER JOIN

Oracle OUTER JOIN

Soul-Learner 2010. 10. 9. 12:20

========================================================================================
전체사원의 이름과 부서명을 출력하려면 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 개의 행이 선택되었습니다.