Oracle - 외부조인 Outer Join

갓김치·2020년 8월 24일
1

Oracle

목록 보기
24/33

참고

2020-08-24-02)외부조인.sql

외부조인 Outer Join

  • 내부조인: 조인조건에 일치하지 않는 자료는 무시함
  • 외부조인: 부족한 테이블에 NULL 값을 채워 조인 수행
  • 일반 외부조인 형식에서 외부조인 연산자는 '(+)' 이다.
  • 일반, ANSI 형식 다름
  • 조인조건에서 자료의 '종류'가 부족한 쪽에 외부조인 연산자 사용

주의사항

  • 외부조인 조건에 해당하는 조인조건 모두에 '(+)'을 사용 해야한다.
  • 한번에 한테이블에서만 외부조인을 할 수 있다.
    즉, A,B,C 테이블이 있고 A를 기준으로 B테이블을 외부조인한 경우 동시에 C를 기준으로 B테이블을 외부조인할 수 없다.
    • WHERE A.COL=B.COL(+)
      ......AND C.COL=B.COL(+) 은 허용되지 않음
  • (+)연산자가 사용된 조건과 OR, IN 연산자는 함께 사용할 수 없다
  • 일반 외부조인연산자와 일반조건이 함께 사용되면 정확한 결과를 얻을 수 없다.
    서브쿼리나 ANSI 외부조인을 사용해야함
  • COUNT 사용시 * 사용금지 (NULL값도 행으로 출력됨)

사용형식

일반 외부조인

ANSI 외부조인

  • 판별방법
    • 1.FROM절 테이블 정보가 더 많다 = LEFT
    • 2.FROM절 테이블 정보가 더 적다 = RIGHT --> 더많은쪽에 LEFT,RIGHT해주면됨
    • 3.양쪽이 서로 부족하다 = FULL

외부조인 예시

1. 모든 상품분류별 상품의 가지수를 조회하시오

  • Alias : 분류코드, 분류명, 상품수
  • 모든 : OUTER JOIN
  • 상품분류별 : GROUP BY
  • 상품의 가지수 : COUNT

일반 외부조인

1단계: 분류테이블 확인

2단계: 상품테이블에서 사용된 분류코드를 중복없이 검색

3단계: 결과

ANSI 외부조인

1,2단계 같음

3단계: 결과

RIGHT를 LEFT로 쓴다면?

  • 내부조인처럼 처리됨! 실수조심!

2. 매입테이블에서 2005년 5-6월에 매입정보를 이용하여 전체상품에 대한 매입정보를 조회하시오

  • Alias: 상품코드, 상품명, 매입수량, 매입금액
  • 전체(모두): OUTER JOIN
  • 상품별: GROUP BY
  • 연도,기간: 일반조건
  • 수량은 매입수량이 더많겠지만, 상품종류는 PROD가 더많음!

일반 외부조인

  • 결과: 총 상품종류수인 74행이 나와야하는데 48행만 나옴
  • ANSI로 조인해야함

ANSI 외부조인

실수

결과

제대로

결과

3.모든부서별 인원수를 출력하시오

  • Alias: 부서코드, 부서명, 사원수

일반 외부조인

결과: 사장 누락됨

ANSI 외부조인

결과: 사장 포함

외부조인 문제

1. 직무이력테이블(JOB_HISTORY)의 자료를 이용하여 모든 사원에 대하여 직무이력테이블의 사원번호와 부서코드가 현재 사원테이블의 내용과 같은 사원을 조회하시오

  • Alias: 사원번호, 사원명, 직무코드, 부서코드

일반 외부조인

결과: 사장 빼고 잘 나옴

2. 2005년 전체상품에 대한 상품별 매입금액합계와 매출금액합계를 구하시오

  • 단, 매입매출실적이 없으면 '0'을 출력하고 상품번호순으로 출력할 것
  • Alias: 상품코드, 상품명, 매출금액, 매입금액

ANSI 외부조인

  • 일반조건때문에 ANSI로 해야함
  • 매출금액 0 인 캐쥬얼 벨트 포함 --> 총 74행

일반 외부조인 (사용불가)

  • 매출금액 0 인 캐쥬얼 벨트가 missing --> 총 73행
profile
갈 길이 멀다

2개의 댓글

comment-user-thumbnail
2020년 8월 26일

멀다멀다

1개의 답글