여러 방법이 있겠죠~ 0 0 3,031

by 박종정 [2008.06.10 17:29:59]


 

=================================================================

CONNECT BY절 이용


SELECT /*+ ORDERED USE_NL(D1,D2,B)
                       INDEX_DESC(B IDX_TEST_LIST_01) */
                D2.NO, B.*
FROM (
             SELECT '20080601' S_DATE,
                              3 DAY_NUM,
                              5 ROW_NUM
             FROM DUAL A
            ) D1,
           (
            SELECT LEVEL NO
            FROM DUAL CONNECT BY LEVEL <= 5
            ) D2, TEST_LIST B
WHERE D2.NO <= DAY_NUM
AND COL3 < TRUNC(TO_DATE(S_DATE,'YYYYMMDD'))-D2.NO+2
AND COL3 >= TRUNC(TO_DATE(S_DATE,'YYYYMMDD'))-D2.NO+1
AND ROWNUM <= D2.NO * D1.ROW_NUM
AND ROWNUM <= DAY_NUM * D1.ROW_NUM;

=================================================================

이쁘고 깔끔하게 COPY_T... 이용 위 쿼리와 로직은 같음

SELECT /*+ ORDERED USE_NL(D1,A, B)
                       INDEX_DESC(B IDX_TEST_LIST_01) */
                A.NO, B.*
FROM (
              SELECT '20080601' S_DATE,
                               3 DAY_NUM,
                               5 ROW_NUM
              FROM DUAL
             ) D1, COPY_T A, TEST_LIST B
WHERE A.NO <= DAY_NUM
AND COL3 < TRUNC(TO_DATE(S_DATE,'YYYYMMDD'))-A.NO+2
AND COL3 >= TRUNC(TO_DATE(S_DATE,'YYYYMMDD'))-A.NO+1
AND ROWNUM <= A.NO * D1.ROW_NUM
AND ROWNUM <= DAY_NUM * D1.ROW_NUM;

=================================================================

뭐.. 여러 방법중에 예로 UNION  ALL을 이용해서 퍼포먼스는 더 좋게 할 수 있겠습니다만,

이런 문제에 대해서 한번 고민해 보는것두 괜찮을듯 싶어서 내봤습니다..^^*

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입