본문 바로가기
Programming/Oracle

일정 영역의 숫자를 row로 생성하는 오라클(Oracle) 쿼리

by NAMP 2011. 11. 24.

그동안 DICTIONARY 를 이용한 것은 정말 뻘짓이었네요.....
이것으론 1800 여개까지만 가능하다는 것을 알고 다른것을 찾다가, 

CONNECT BY LEVEL 을 찾았습니다!!!!


출처 : http://sewony.tistory.com/entry/%EC%9D%BC%EC%A0%95-%EC%98%81%EC%97%AD%EC%9D%98-%EC%88%AB%EC%9E%90%EB%A5%BC-row%EB%A1%9C-%EC%83%9D%EC%84%B1%ED%95%98%EB%8A%94-%EC%98%A4%EB%9D%BC%ED%81%B4Oracle-%EC%BF%BC%EB%A6%AC

간혹 일정 영역의 숫자 ( 예를 들면 1에서 10까지)를 row로 생성해야 하는 경우가 있다.

이런 경우 사용하는 쿼리


1. Pure SQL

SELECT ROWNUM n
FROM   ( SELECT 1 just_a_column
         FROM   dual
         CONNECT BY LEVEL <= 10
       )



2. Oralce 10g 이상

SELECT LEVEL just_a_column
FROM   dual
CONNECT BY LEVEL <= 10

한번 쿼리를 실행해보기 바란다.
이뿌게.. 다음과 같이 결과가 나온다

1
2
3
4
5
6
7
8
9
10



SELECT MI_TIME
    ,  NVL(OPGT_RATE,0) AS OPGT_RATE
    ,  NVL(AGRIW_PPS,0) AS AGRIW_PPS
    ,  NVL(OWRV_PPS,0) AS OWRV_PPS
--    ,  RSVR_CODE
  FROM 
  (
    SELECT  DTTM.MI_TIME
          , RANK() OVER (PARTITION BY DTTM.MI_TIME ORDER BY FIELD_SEQ DESC) AS RN
          , MFI.FIELD_SEQ
          , MFI.OPGT_RATE
          , MFI.AGRIW_PPS
          , MFI.OWRV_PPS
          , MFI.RSVR_CODE
            
        FROM 
        (
          SELECT NUM
              , FROM_TIME
              , TO_TIME
              --, TO_CHAR(FROM_TIME + (NUM-1)/24/60,'YYYYMMDDHH24MI') AS MI_TIME
              , TO_CHAR(FROM_TIME + (NUM-1),'YYYYMMDDHH24MI') AS MI_TIME
            FROM
            (
             SELECT LEVEL NUM
                  , FROM_TIME
                  , TO_TIME        
             FROM
                 (
                      SELECT  
                            --TRUNC((TO_TIME - FROM_TIME) * 24 * 60) AS DIFF
                            (TO_TIME - FROM_TIME) AS DIFF
                            , FROM_TIME
                            , TO_TIME                  
                      FROM (
                            SELECT TO_DATE('20111125', 'YYYYMMDD') + 1  TO_TIME
                              , TO_DATE('20111124', 'YYYYMMDD')  FROM_TIME 
                              FROM dual
                             )
                    ) DIFF
              CONNECT BY LEVEL <= DIFF.DIFF
            )
        ) DTTM
        LEFT JOIN MOB_FIELD_INFO MFI
            ON TO_DATE(DTTM.MI_TIME,'YYYYMMDDHH24MI') BETWEEN TO_DATE(MFI.DISW_START_DTTM,'YYYYMMDDHH24MI') AND TO_DATE(MFI.DISW_END_DTTM,'YYYYMMDDHH24MI')
  )
  WHERE RN = 1
    AND RSVR_CODE = 'CODE'

    


    




 

댓글