SQL*Plus, 데이터 연결 방법 – Union, Group by: 양측 Outer joins의 해결

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 – 대용량 데이터베이스

Leave a Reply