SELECT TO_CHAR(B.INS_DATE , 'YYYY-MM-DD') ins_date, count( CASE WHEN B.INS_DATE > TO_DATE((TO_CHAR(sysdate-(7-1) , 'YYYYMMDD')), 'YYYYMMDD') THEN 1 END ) count FROM TPM11 A, TPM15 B WHERE ( A.INDEXING_FLG=0 OR A.INDEXING_FLG=7 OR A.INDEXING_FLG IS NULL ) AND B.BUB_CD = A.BUB_CD (+) AND B.SA_NO = A.SA_NO (+) AND B.GA_SER = A.GA_SER (+) AND B.PAN_SER = A.PAN_SER (+) AND B.CHG_CD = A.CHG_CD (+) GROUP BY TO_CHAR(B.INS_DATE , 'YYYY-MM-DD')
SELECT TO_CHAR(b.ins_date, 'yyyy-mm-dd') ins_date , COUNT(a.bub_cd) cnt FROM tpm15 b LEFT OUTER JOIN tpm11 a ON b.bub_cd = a.bub_cd AND b.sa_no = a.sa_no AND b.ga_ser = a.ga_ser AND b.pan_ser = a.pan_ser AND b.chg_cd = a.chg_cd AND a.indexing_flg IN (0, 7) WHERE b.ins_date >= TRUNC(sysdate-(7-1)) GROUP BY TO_CHAR(b.ins_date, 'yyyy-mm-dd') ;
기존 쿼리가 이상해진 이유 분석
1. 아우터 조인 후에 a 의 indexing_flg 에 조건을 주다보니 오류 발생
- a.indexing_flg(+) = 0 OR a.indexing_flg(+) = 7
- 이렇게 했는데 아우터 조인에 or 사용 못한다고 오류발생
2. indexing_flg 에 조건에 (+) 기호 제거했더니
- 오류는 안나는데 아우터 조인 안됨
3. 그래서 OR indexing_flg IS NULL 조건 추가 했으나
- 조인에 실패한 것은 나오지만
- 조인에 성공했지만 0,7 이 아닌 것은 제외됨
4. 그래서 tmp15 를 두번 읽어 다시 또 아우터 조인
5. 기타 문제점
- count(*) 로 인해 조인에 실패한 자료는 0건이어야 하는데 1건이 나오는 문제도 있음