SQL*Plus, 데이터 연결 방법 – Union, Group by: 양측 Outer joins의 해결
/** * 수정전 */ SELECT yyyymm , 불입금액 , 인출금액 FROM ( SELECT 관리번호 , yyyymm FROM 예적금원장 a , MONTH_DUAL d WHERE a.부서코드 = :deptno AND d.yyyymm between :in_date and :end_date ) x, ( SELECT 관리번호 , substr(불입일자,1,6) 불입년월 , sum(원화금액) 불입금액 FROM 예입내역 WHERE 불입일자 between :in_date and :end_date GROUP BY 관리번호, substr(불입일자,1,6) ) b, ( SELECT 관리번호 , substr(인출일자,1,6) 인출년월 , sum(원화금액) 인출금액 FROM 인출내역 WHERE 인출일자 between :in_date and :end_date GROUP BY 관리번호, substr(인출일자,1,6) ) c WHERE b.관리번호(+) = x.관리번호 AND b.불입년월(+) = x.yyyymm AND c.관리번호(+) = x.관리번호 AND c.인출년월(+) = x.yyyymm GROUP BY yyyymm;
/** * 수정후 - 인덱스 미사용 */ SELECT 년월 , nvl(sum(불입금액),0) , nvl(sum(인출금액),0) FROM ( SELECT 관리번호 , substr(불입일자,1,6) 년월 , 원화금액 불입금액 , to_number(null) 인출금액 FROM 예입내역 WHERE 불입일자 between :in_date and :end_date UNION ALL SELECT 관리번호 , substr(인출일자,1,6) 년월 , to_number(null) 불입금액 , 원화금액 인출금액 FROM 인출내역 WHERE 인출일자 between :in_date and :end_date ) GROUP BY 년월;
/** * 수정후 - 인덱스 사용 */ SELECT substr(인출일자,1,6) , nvl(sum(불입금액),0) , nvl(sum(인출금액),0) FROM ( SELECT 관리번호 , 불입일자 년월 , 원화금액 불입금액 , to_number(null) 인출금액 FROM 예입내역 WHERE 불입일자 between :in_date and :end_date UNION ALL SELECT 관리번호 , 인출일자 년월 , to_number(null) 불입금액 , 원화금액 인출금액 FROM 인출내역 WHERE 인출일자 between :in_date and :end_date ) GROUP BY 년월;
원문 출처
Encore – 대용량 데이터베이스