• 특정 부서(AA)의 모든 입출금 내역 검색
    1. 전제 ⓐ 예적금원장(ACCOUNT)을 기준으로 입금내역(INPUT)과 출금내역(OUTPUT)이 방사형으로 연결
    2. 전제 ⓑ 입금과 출금 내역을 월별로 집계하여 비교
    3. 전제 ⓒ 방사형 구조 특징 - "M:M"조인이 발생하므로 각각의 집합을 먼저 group by 하여 "1:1"로 조인의 범위를 줄임
  • 조인 이용한 입출금내역 조회
    1. 인출일과 입금일이 연결되지 않을 경우를 위해 outer join을 수행 - 한쪽 outer join을 수행하였으므로 수행결과는 잘못 되었음
    2. outer join query
  • 정상적인 결과를 얻기 위해서 양쪽 outer join을 수행 : 임시 집합 추가해서 해결
    1. month_dual 테이블 생성 : 일자만 모은 dummy테이블.
      ⇒ date type column + varchar type column으로 구성하여 향후 몇 십년 정도의 데이터를 모아서 관리하며 인덱스 필요함
    2. 임시 집합(x) 추가
    3. union & outer join query
  • union과 group by 이용한 입출금내역 조회
    1. outer join사용하지 않음
    2. "to_number(null) out_amt / to_number(null) inp_amt"에서 "0"대신 null 사용
      ⇒ null을 사용하면 sum 연산 대상에서 제외되므로 그만큼 연산 처리 감소
      ⇒ "0"이 있으면 0의 개수만큼 연산 처리함
      ⇒ null은 문자 타입으로 간주 되므로 to_number 함수를 사용하여 데이터 타입을 맞춤
    3. union 주의 사항
      1. 반드시 상호간의 컬럼 개수와 타입 일치
      2. 각각의 select 문에 구분값을 둠 - group by시 decode로 분리 할 필요가 없으며 decode함수를 제공하지 않는 DBMS에서도 활용가능한 쿼리임
  • union & group by query
  • 잘못된 사례1. 쿼리문을 단순하게 하기 위해서 where절의 공통조건을 인라인뷰 밖으로 보낸 경우
    1. 전제 : 인라인뷰 밖에서 부여한 조건이 각각의 select문 안으로 파고들어가 수행
    2. 문제점 : 공통 컬럼인 'yyyymm'이 substr로 가공된 컬럼이므로 인덱스 사용 불가
    3. 주의 : 인라인뷰 내의 컬럼을 가공시키지 않는다.
    4. 잘못된 사례1 query
  • 잘못된 사례2. 형태가 다른 컬럼을 공통화시키기 위해 가공화
    1. 전제 : 입금내역 테이블의 컬럼은 "년원" 형식, 출금내역 테이블의 컬럼은 "일자" 형식으로 되어 있을 경우 이 두 컬럼을 공통화 시키기
    2. 문제점 : "일자" 컬럼을 "년월"에 ?추기 위해 substr로 가공
    3. 해결
      1. 만약 두 컬럼을 맞춰야 한다면 "년월"컬럼을 "일자"컬럼에 맞춤
      2. between 조건에 의해 두 컬럼은 처리되므로 group by에서 substr로 가공해서 공통화하는 것 권장
      3. group by 절에서 컬럼 가공 : 인덱스 사용과는 무관
      4. 자세한 내용은 "3장 인라인 뷰의 활용 9. 상이한 집합의 통일" 참고
    4. 잘못된 사례2 query