더 좋은 방법이 있는지 여쭤봅니다... 0 4 1,868

by 짱짱 [2009.02.10 10:42:09]


다음 3개의 테이블(AA, BB, CC)의  조건문은 동일합니다.
(설문조사를 마쳤는지 알아보기위해) 3개 테이블에 등록된 건수를 조회하는 내용입니다.

한번 쿼리문을 작성해봤는데,  튜닝이 가능한지 여쭤봅니다.

-- 오늘을 기준으로 6개월 이전까지 등록된 건수만 조회

SELECT NVL(SUM(cnt),0)  FROM
(
  SELECT COUNT(1) cnt  FROM   AA  
        WHERE perid=’347288’ AND ADD_MONTHS(TO_DATE(SUBSTR(conid,1,8)), 6) > SYSDATE
    UNION  
  SELECT COUNT(1) cnt  FROM   BB   
        WHERE perid=’347288’ AND ADD_MONTHS(TO_DATE(SUBSTR(conid,1,8)), 6) > SYSDATE
   UNION
  SELECT COUNT(1) cnt  FROM   CC  
        WHERE perid=’347288’ AND ADD_MONTHS(TO_DATE(SUBSTR(conid,1,8)), 6) > SYSDATE
)

-- 날짜 비교부분 수정해서 다시 올렸습니다.

히스토리를 모르는 상황에서,  유지보수 업무.... 생각보다 어렵네요.... ㅠㅠ

 

by 마농 [2009.02.10 10:54:28]
일단 union은 union all로 바꾸셔야 합니다.
그리고 테이블이 다르니 조건은 각각 주시는 것이 맞구요
condid를 가공해서 sysdate와 비교하지 마시고 sysdate를 가공해서 condid와 비교하세요.

by 짱짱 [2009.02.10 11:23:51]
감사합니다...
sydate를 가공하라는 것은???
conid는 자바단에서 생성된 문자열이라서 TO_DATE 해줘야하고,
6개월간의 간격이 필요하고, 그럼 다른 날짜함수를 이용하면
MONTHS_BETWEEN (SYSDATE, TO_DATE(SUBSTR(conid,1,8))) < 6
두 결과는 같게 나옵니다.
근데 차이가 뭔지는 모르겠네요.... ^^;

by 마농 [2009.02.10 12:31:26]
컬럼을 변형하지 않고도 비교가 가능합니다.
condid >= TO_CHAR(ADD_MONTHS(sysdate,-6),'yyyymmddhh24miss')

by 짱짱 [2009.02.10 14:56:13]
날짜 데이터라고 꼭 날짜로만 비교를 하려했었네요. ^^
감사합니다~
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입