group by, union, distinct 같은 연산자가 불필요하게 많이 사용되는 패턴을 보이는 경우, 데이터 모델이 잘 정규화 되지 않음을 알 수 있다.
즉, 데이터 모델 이상으로 발생한 데이터 중복 제거하기 위해서 sort 명령을 수행하게 되는 경우이다.
SELECT A.상품ID, A.과금액, B.수납액, B.수납일시
FROM (SELECT 고객ID, 상품ID, 과금연월, SUM(과금액) 과금액
FROM 과금
WHERE 과금연월 = :과금연월
AND 고객ID = :고객ID
GROUP BY 고객ID, 상품ID, 과금연월) A,
수납 B
WHERE A.고객ID = B.고객ID(+)
AND A.상품ID = B.상품ID(+)
AND A.과금연월 = B.과금연월(+)
ORDER BY A.상품ID, B.순번
;
SELECT A.상품ID, A.과금액, B.수납액, B.수납일시
FROM 과금 A, 수납 B
WHERE A.과금연월 = :과금연월
AND A.고객ID = :고객ID
AND B.고객ID(+) = A.고객ID
AND B.상품ID(+) = A.상품ID
AND B.과금연월(+) = A.과금연월
ORDER BY A.상품ID, B.순번
;
SELECT 과금.고객ID, 과금.상품ID, 과금.과금액, 가입상품.가입일시
FROM 과금,
(SELECT 고객ID, 상품ID, MIN(가입일시) 가입일시
FROM 고객별상품라인
GROUP BY 고객ID, 상품ID) 가입상품
WHERE 과금.고객ID(+) = 가입상품.고객ID
AND 과금.상품ID(+) = 가입상품.상품ID
AND 과금.과금연월(+) = :YYYYMM
;
SELECT 과금.고객ID, 과금.상품ID, 과금.과금액, 가입상품.가입일시
FROM 과금, 가입상품
WHERE 과금.고객ID(+) = 가입상품.고객ID
AND 과금.상품ID(+) = 가입상품.상품ID
AND 과금.과금연월(+) = :YYYYMM
;
SELECT ......
FROM (
SELECT ......
FROM 소송심급피해대상 A,
소송대상청구 B,
소송심급 C,
소송 D,
소송결재 E,
민원마스터 F,
VOC유형코드 G,
(SELECT ......
FROM (SELECT ......,
RANK() OVER(PARTITION BY ...... ORDER BY 종결년도 DESC, 종결순번 DESC) RANK
FROM 소송심급대상종결 A)
WHERE RANK = 1) H,
(SELECT ......
FROM (SELECT ......,
RANK() OVER(PARTITION BY ...... ORDER BY 마감일자 DESC) RANK
FROM 피해청구 A)
WHERE RANK = 1) I,
(SELECT ......
FROM (SELECT ......,
RANK() OVER(PARTITION BY ...... ORDER BY A.판결년도 DESC, A.순번 DESC) RANK
FROM 판결 A,
소송피해내용 B,
소송금 C,
소승소득내용 D,
(SELECT ......
FROM (SELECT ......,
RANK() OVER(PARTITION BY ...... ORDER BY 순번 DESC) RANK
FROM 소송결재
WHERE ......)
WHERE RANK = 1) E
WHERE A.판결년도 = B.판결년도
AND A.판결순번 = B.판결순번
AND ......)
WHERE RANK = 1) J,
(SELECT ......
FROM (SELECT ......,
RANK() OVER(PARTITION BY ...... ORDER BY A.특인차수 DESC, B.순번 DESC) RANK
FROM 특인 A,
특인결재 B
WHERE A.특인년도 = B.특인년도
AND A.특인순번 = B.특인순번
AND ......)
WHERE RANK = 1) K,
(SELECT ......
FROM (SELECT ......,
RANK() OVER(PARTITION BY ...... ORDER BY A.소송심급피해대상순번 DESC) RANK
FROM 소송대상청구 A,
소송심급피해대상 B,
소송심급 C,
소송 D
WHERE ......)
WHERE RANK = 1) L
WHERE ......)
;