문제 링크 : https://velog.io/@yooha9621/SQLP실기문제-4장-조인튜닝-스칼라서브쿼리43번
select /*+ leading(T1) USE_NL(T2)*/ T1.*
from (
select c.고객번호, c.고객명
from 고객 c
where c. 가입일시 >= trunc(add_months(sysdate, -1), 'mm')
) T1,(/*+ NO_MERGE PUSH_PRED */select 고객번호
,avg(거래금액) 평균거래
,min(거래금액) 최소거래
,max(거래금액) 최대거래
from 거래
where 거래일시 >= trunc(sysdate, 'm㎜')
group by 고객번호) T2
where T1.고객번호 = T2.고객번호;
select /*+ ORDERED USE_NL(T1) */ c.고객번호, c.고객명
from 고객 c,(select /*+ NO_MERGE PUSH_PRED */ 고객번호
,avg(거래금액) 평균거래
,min(거래금액) 최소거래
,max(거래금액) 최대거래
from 거래
where 거래일시 >= trunc(sysdate, 'm㎜')
group by 고객번호) T1
where c.가입일시 >= trunc(add_months(sysdate, -1), 'mm')
where T1.고객번호 = T2.고객번호;
또는
select /*+ ORDERED USE_NL(T1) NO_MERGE(T1) PUSH_PRED(T1) */ c.고객번호, c.고객명
from 고객 c,(select 고객번호
,avg(거래금액) 평균거래
,min(거래금액) 최소거래
,max(거래금액) 최대거래
from 거래
where 거래일시 >= trunc(sysdate, 'm㎜')
group by 고객번호) T1
where c.가입일시 >= trunc(add_months(sysdate, -1), 'mm')
where T1.고객번호 = T2.고객번호;
그러면 이 상황에서 부분범위처리가 들어가면 쿼리는 어떻게 변하는거지..? 🤔
select * from ( select c.고객번호, c.고객명 from 고객 c,(select /*+ NO_MERGE PUSH_PRED */ 고객번호 ,avg(거래금액) 평균거래 ,min(거래금액) 최소거래 ,max(거래금액) 최대거래 from 거래 where 거래일시 >= trunc(sysdate, 'm㎜') group by 고객번호) T1 where c.가입일시 >= trunc(add_months(sysdate, -1), 'mm') where T1.고객번호 = T2.고객번호 ) where rownum <= 10;
- 이렇게 되나?? 비슷한 문제가 저번 SQLP에 나왔는데 나는 내 답안같이 한번 감싸서 명시적으로 '부분범위 처리 후'에 조인하도록 기술하였다.근데 그렇게 써서 내가 점수를 반만 받았던건가!!??
- 아래가 답이라면 .. 고객 테이블과 거래 테이블 조인 작업을 한 블록 안에다가 넣고 힌트 명시하고 밖에다가 부분 범위 처리를 하면 되는건가 ?