문제 링크 : https://velog.io/@yooha9621/SQLP실기문제53번
[인덱스 추가]
작업지시_X1 : 작업자ID + 실제 방문일자
select *
from (SELECT /*+ LEADING(A) USE_NL(B) USE_NL(C) INDEX(A 작업지시_X1)*/
A.작업일련번호 , A.실제방문일자 ,
NVL2(A.개통접수번호,'개통','장애') 접수구분,
NVL2(A.개통접수번호,B.고객번호,C.고객번호) 고객번호 ,
NVL2(A.개통접수번호,B.주소,C.주소) 주소
FROM 작업지시 A , 개통접수 B , 장애접수 C
WHERE 작업자ID = 'Z123456'
AND B.개통접수번호(+) = 개통접수번호
AND C.장애접수번호(+) = 장애접수번호
AND A.작업일자 >= TRUNC(ADD_MONTHS(SYSDATE , -1))
ORDER BY 실제방문일자 DESC )
WHERE ROWNUM <= 10;
🍎 정리
- 실제 방문일자를 기준으로 부분 범위 처리 하므로 '작업자ID' 액세스 조건 처리후
정렬된 '실제방문일자'로 부분범위처리할 수 있는 인덱스를 드라이빙 테이블로 놓고 개통접수번호에 따라 '개통접수' 테이블 또는 '장애접수'테이블과 NL 아우터 조인하여 10건을 추출하도록 한다.
🔥 놓친 부분
- 조인 조건이 하나라도 불완전하면 아예 조회를 하지 않으므로 반드시 개통접수 테이블과 장애접수 테이블에 조인을 할 때 아우터 조인을 시도한다!!!!!!
- 조인할 때 개통접수번호(장애접수번호)가 NULL이면 NL조인도 그냥 안되는거다.이 때 둘 중 하나가 안되면 다른 하나는 조인이 되어야 하기 때문에 아우터 조인으로 처리해야 하는 것이다.
😥 헷갈렸던 부분
- NVL2("값", "지정값1", "지정값2")
- NVL2 함수는 NULL이 아닌 경우 지정값1을 출력하고, NULL인 경우 지정값2를 출력한다.
- 아우터조인 대상 테이블은 누가 되어야 하는가 ?
- 조인이 되지 않아도 널값으로 표기되어야 하는 테이블은 개통접수 테이블과 장애접수 테이블이다.
- 근데 나는 거꾸로 썼다..작업 지시 테이블이 아우터 조인 대상이 되게...바보 ㅠ 그러면 만약에 조인되지 않았다면 아우터조인을 하나마나 결과 출력이 안됐을거자나 !! ㅠ_ㅠ!!