마뇽님 오라클 퀴즈중에서 질문 드릴 것이 있습니다. 1 2 2,545

by 손님 MODEL [2012.12.12 10:49:00]



안녕하세요.
오라클 퀴즈를 공부하고 있는 학생입니다.
MODEL절 공부중 의문점이 있어서 실례를 무릎쓰고 글을 올립니다.

WITH t AS
(
SELECT 3 no1, TO_NUMBER(null) no2, TO_NUMBER(null) no3, TO_NUMBER(null) no4, 4 no5 FROM dual
UNION ALL SELECT null, null, null, null, null FROM dual
UNION ALL SELECT null, null, 2, null, null FROM dual
UNION ALL SELECT null, null, null, 5, null FROM dual
UNION ALL SELECT null, null, null, 6, null FROM dual
)
SELECT *
FROM t
MODEL
DIMENSION BY (ROWNUM rn)
MEASURES (no1, no2, no3, no4, no5)
RULES
(
  no1[any] = NVL(no1[cv()], COALESCE(no5[cv()-1], no4[cv()-1], no3[cv()-1], no2[cv()-1], no1[cv()-1]))
, no2[any] = NVL(no2[cv()], no1[cv()])
, no3[any] = NVL(no3[cv()], no2[cv()])
, no4[any] = NVL(no4[cv()], no3[cv()])
, no5[any] = NVL(no5[cv()], no4[cv()])
)
;

위의 쿼리중에서
no1[any] = NVL(no1[cv()], COALESCE(no5[cv()-1], no4[cv()-1], no3[cv()-1], no2[cv()-1], no1[cv()-1]))
이 부분을 no1[any] = NVL(no1[cv()], no5[cv()-1])로 고치면 결과가 다르게 나오던데
이유가 몬지 도통 모르겠습니다.
제가 이해한 CV()함수는 디멘션을 기준으로 메저 값을 불려오는 것인데
만약 no5[cv()-1] 이렇게 했을 경우 첫번째줄에서 no5에 값을 저장 되기 때문에
그 다음부터는 no5[cv()-1] 이렇게 사용했을 경우 값이 있어야 한다고 생각하는 데
제 예상과 다르게 null이 나옵니다.

이유가 너무 궁금합니다.
by 마농 [2012.12.12 10:58:10]
[질문]
만약 no5[cv()-1] 이렇게 했을 경우 첫번째줄에서 no5에 값을 저장 되기 때문에
그 다음부터는 no5[cv()-1] 이렇게 사용했을 경우 값이 있어야 한다고 생각하는 데
제 예상과 다르게 null이 나옵니다.
[답변]
네 말씀하신 그대로 첫번째 줄에 no5 값이 있지요. 따라서 두번째 no1 은 잘 나오겟지요
그러나 2번째 줄부터는 no5 값이 없습니다. 따라서 3번째부터는 no1 이 값이 없겟지요.
[설명]
처리순서를 이해하셔야 합니다.
위 구문의 처리순서를 다음과 같이 생각하셨다면 오산입니다.
no1[1] > no2[1] > no3[1] > no4[1] > no5[1] > no1[2] > no2[2] > ...  이거 아닙니다.
다음 순서대로 처리됩니다.
no1[1] > no1[2] > no1[3] > no1[4] > no1[5] > no2[1] > no2[2] > ... 이거 맞습니다.

by 손님 [2012.12.12 11:01:49]

감사합니다!
가려운 곳을 정확하게 알아내시네요.^^
제가 처리 순서를 잘못 이해했습니다.
마농님이 전자로 지적한대로 이해를 하고 있었습니다.
정말 감사해요^^
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입