이준빈은 호박머리

IT 프로그래밍 개발 정보 블로그, 이준빈은 호박머리 입니다.

Database/ORACLE

오라클 OUTER JOIN

준콩이 2012. 8. 14. 13:22
반응형

■ Outer Join
- Join조건을 만족하지 않는 경우에도 다른 행들을 보기 위해 사용
- 한쪽 테이블에는 해당하는 데이터가 존재하는데 다른 쪽 테이블은 데이터가 존재하지 않을

  경우 모두 데이터를 출력하게 하는 조인
- 조인시킬 값이 없는 즉 null행으로 결합하는(데이터가 없는 table) 쪽에 (+)연산자를 사용
- (+)를 사용하는 위치는 Join할 데이터가 부족한 쪽에 위치시킴
- Outer Join조건이 걸려있는 테이블에는 다른 조건절이 들어와도 똑같이

  Out조인 연산자를 (+) 해주어야함


- left out join : 왼쪽 테이블이 기준
  왼쪽 테이블의 자료는 모두 출력되고 오른쪽 테이블의 자료는 연결되는 것들만 출력
  왼쪽 테이블 컬럼명 = 오른쪽 테이블 컬럼명(+);


- right outer join : 오른쪽 테이블이 기준
  왼쪽 테이블의 컬럼명(+) = 오른쪽 테이블;


- 제약사항 : 표현식의 한측에만 올수 있는데 정보가 부재한 쪽에 둠
  다른 테이블의 어떠한 컬럼에도 일치하지 않는 한 테이블의 행을 돌려줌
  outer join을 포함하는 조건은 IN연산자를 사용할 수 없고, OR연산자에 의해 다른 하나의

  조건에 연결하는 것이 불가능하고, SubQuery를 사용할 수 없음



- In/Or절 사용 해결 방안

 


* decode를 사용하여 각각의 조건에 대해 상수값을 지정하고 밖에서 조건별 상수값을

  비교하는 방법으로 해결 가능

 

- SubQuery절 사용 해결 방안
  두집합 사이에의 outer join은 에러를 발생시킴. 오라클 8i부터는 아래의 방법으로 해결가능
  이런 경우 결과는 집합이지만 집합이 아니라는 것을 옵티마이저를 속이기위해 집합의 결과에

  영향을 미치지 않는 문자열을 Concat 시키면 옵티마이저는 집합의 Outer Join이 아니라
  상수와의 Outer Join으로 인식하고 에러를 발생시키지 않고 Outer Join의 결과를

  정확히 나타냄

- 사원정보와 부서정보 출력

  ① select s.*,p.part_name
      from part p, sawon s
      where s.part_code(+)=p.part_code;

  ② select s.*,p.part_name
      from part p left outer join sawon s
      on s.part_code=p.part_code;

  ③ select s.*,p.part_name
      from sawon s right outer join part p
      on s.part_code=p.part_code;


  · sawon테이블

 
  · part테이블



  → 결과값 :


출처 : http://blog.naver.com/bleu_ciel/140037312732

반응형