그동안 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'
'Programming > Oracle' 카테고리의 다른 글
PL/SQL User's Guide and Reference (0) | 2011.11.25 |
---|---|
오라클 누적합 구하기 (0) | 2011.11.25 |
두 시간 사이를 분단위로 구해보자. (0) | 2011.11.24 |
커서로 반복 작업을 할때에 (0) | 2011.11.17 |
[ORACLE] 컬럼 추가, 수정, 삭제 (0) | 2011.11.17 |
댓글