by stevekim [SQL Query] CONNECT BY DBMS_RANDOM.VALUE [2024.08.07 13:13:12]
안녕하세요. 다음의 쿼리문이 잘 돌아가는데 (이거작성하느라 꼬박 하루가 ㅠㅠ), 여하튼 AI등 물어 물어 작성하였는바.
이해가 잘 안되는 부분이 있어서 알기쉽게 말씀해주시면 복을 마니마니 받으실겁니다. ^^
아래의 쿼리문에서 PRIOR YEAR||SEMSTR_CD = YEAR||SEMSTR_CD 이렇게 해도 오류(무한루프)고, YEAR및 SEMSTR_CD가 KEY즉 UNIQUE가 아니어도 오류입니다.
또 PRIOR dbms_random.value IS NOT NUL 이문장을 왜써야하는지 잘모르겠어요 ㅠㅠ (안쓰면 오류 ㅠㅠ)
WITH your_table AS ( SELECT year , semstr_cd , begin_dt , end_dt FROM wu_hak.th_hakj_schdul c ) SELECT year || substr(semstr_cd,5,1) AS clw_yyse , '1' as clw_camp , to_char(LEVEL) AS clw_clwk , TO_CHAR(TO_DATE(begin_dt, 'YYYYMMDD') + ((LEVEL - 1) * 7), 'YYYYMMDD') AS clw_stdt , TO_CHAR(TO_DATE(begin_dt, 'YYYYMMDD') + ((LEVEL - 1) * 7) + 6, 'YYYYMMDD') AS clw_eddt , '' as clw_cmnt FROM your_table CONNECT BY PRIOR year = year AND PRIOR semstr_cd = semstr_cd AND PRIOR dbms_random.value IS NOT NULL AND LEVEL <= FLOOR((TO_DATE(end_dt, 'YYYYMMDD') - TO_DATE(begin_dt, 'YYYYMMDD')) / 7) + 1 ORDER BY year, semstr_cd, clw_stdt;
단일행을 여러행으로 복제할 때 사용하는 기법 중 하나가
CONNECT BY LEVEL 을 이용하는 방법입니다.
이 방식은 1건의 자료일 때만 적용하는 방식인데
여러건의 자료에 직접 적용을 하면
원치 않게 기하급수로 늘어나게 되어 큰일이 납니다.
이를 방지하는 기법중에 하나가 dbms_random 조건을 넣는 것인데
이게 왜 되는지도 모르고 의미를 알 수 없는 코드가 되어버리므로 저는 이 방법을 추천하지 않습니다.
http://gurubee.net/article/55635
SELECT year || SUBSTR(semstr_cd, 5, 1) AS clw_yyse , '1' AS clw_camp , TO_CHAR(lv) AS clw_clwk , TO_CHAR(sdt + ((lv - 1) * 7) , 'yyyymmdd') AS clw_stdt , TO_CHAR(sdt + ((lv - 1) * 7) + 6, 'yyyymmdd') AS clw_eddt , '' AS clw_cmnt FROM (SELECT year , semstr_cd , TO_DATE(begin_dt, 'yyyymmdd') sdt , TO_DATE(end_dt , 'yyyymmdd') edt FROM wu_hak.th_hakj_schdul ) , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 99) WHERE lv <= FLOOR((edt - sdt) / 7) + 1 ORDER BY year, semstr_cd, lv ;