CONNECT BY 에 관련된 LEVEL 에 대한 이야기에 대해서 말씀드리겠습니다.
간단하게 프로그램으로 풀어 볼까요?
SELECT LEVEL LV, SYSDATE+LEVEL TDATE
FROM DUAL
CONNECT BY LEVEL<=3
상위 구문을 절차 형식으로 고치자면~
INT LEVEL;
LEVEL=1; // 무조건 LEVEL 은 1부터 시작을 합니다.
LOOP WHILE( LEVEL<=3)
PRINT LV, TO_DAY()+LEVEL
LEVEL=LEVEL+1;
END LOOP;
이런 형식으로 바뀌겠네요.
근데, 두개 다 결과는
LV TDATE
1 내일
2 다음날
3 다음 다음날
이렇게 되겠네요.. 그렇다면 응용을 하시면 됩니다.
LEVEL이 조건에 만족할때 까지 무한으로 돌테니까, 거기에 맞게
SQL문을 만들어 주시면 되는 겁니다.
--------------- 여기에 관련 된 해석을 보자면 ------------------------
SELECT DECODE(LPAD(LEVEL-1, 2, '0'),'00','24',LPAD(LEVEL-1, 2, '0')) TM
FROM DUAL CONNECT BY LEVEL <= 24
STEP1.. LEVEL-1 = 0
STEP2. LPAD(0,2,'0') = '00'
STEP3. DECODE 만약에 위 구문이 00이라면 24로 바꾸어 줘라~
STEP4. 그것이 아니라면 LPAD(LEVEL-1,2,'0') 해 주어라
즉 LEVEL = 1 일때는 24로 나오게 되고 나머지는 LEVEL-1을 하여 나오는 겁니다.
그렇다면 구문을 이렇게 바꾸어도 되지 않겠느냐는 겁니다.
SELECT LPAD(LEVEL, 2, '0') TM
FROM DUAL CONNECT BY LEVEL <= 24
결과는 똑같지만,
첫행 결과물이
상위 SQL문을 24로 시작...
하위 SQL문은 01로 시작...
이것이 다른 점입니다.
-------------------------------------------------------------------------------------
LEVEL의 간단한 속성을 아셨으니, 일별로 구하는 건 쉬울 것입니다.