LEVEL 관련 정리 0 0 3,536

by 호야 [Oracle 기초] CONNECT BY LEVEL [2010.03.23 02:08:38]


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의 간단한 속성을 아셨으니, 일별로 구하는 건 쉬울 것입니다.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입