Connect By Levle <= n 형태의 행복제 밥법은
dual 과 같이 1건의 자료에 적용하는 방법입니다.
다건의 집합에 직접 적용하면 큰일(?) 납니다.
http://gurubee.net/article/55635
직접 Connect By 조건을 걸지 마시고
(SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 99) 와 조인하는 형태로 개선해 보세요.
별도 달력 테이블을 가지고 있다면?
Connect By 를 이용하지 않고 달력 테이블을 이용하셔도 됩니다.
holiday_repeat 이란 테이블이 이용 되는데
테이블 이름이나 카운트에 이용하는 걸로 봐서는
이 테이블에 연속되는 일자들을 이미 가지고 있을 것 같은 느낌이 드네요.
테이블 자료 예시와 원하는 결과 자료를
원본 대비 결과표 형태로 예를 들어 주시면 좋을 듯 하네요.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | WITH holiday_repeat AS ( SELECT '01' hlr_hld_id FROM dual UNION ALL SELECT '02' FROM dual UNION ALL SELECT '03' FROM dual UNION ALL SELECT '04' FROM dual UNION ALL SELECT '05' FROM dual UNION ALL SELECT '06' FROM dual UNION ALL SELECT '07' FROM dual UNION ALL SELECT '08' FROM dual ) , holiday AS ( SELECT '01' hld_id, '신정' hld_name, DATE '2020-01-01' hld_start_date, DATE '2020-01-01' hld_end_date FROM dual UNION ALL SELECT '02' , '삼일절' , DATE '2020-03-01' , DATE '2020-03-01' FROM dual UNION ALL SELECT '03' , '어린이날' , DATE '2020-05-05' , DATE '2020-05-05' FROM dual UNION ALL SELECT '04' , '현충일' , DATE '2020-06-06' , DATE '2020-06-06' FROM dual UNION ALL SELECT '05' , '광복절' , DATE '2020-08-15' , DATE '2020-08-15' FROM dual UNION ALL SELECT '06' , '한글날' , DATE '2020-10-09' , DATE '2020-10-09' FROM dual UNION ALL SELECT '07' , '개천절' , DATE '2020-10-03' , DATE '2020-10-03' FROM dual UNION ALL SELECT '08' , '성탄절' , DATE '2020-12-25' , DATE '2020-12-25' FROM dual UNION ALL SELECT '09' , '추석' , DATE '2024-09-16' , DATE '2024-09-18' FROM dual UNION ALL SELECT '10' , '추석' , DATE '2025-10-05' , DATE '2025-10-07' FROM dual UNION ALL SELECT '11' , '설날' , DATE '2024-02-09' , DATE '2024-02-11' FROM dual UNION ALL SELECT '12' , '설날' , DATE '2025-01-28' , DATE '2025-01-30' FROM dual ) SELECT a.hld_id , a.hld_name , TO_CHAR(ADD_MONTHS(a.hld_start_date, y * 12) + d - 1, 'yyyymmdd' ) hld_date , TO_CHAR(ADD_MONTHS(a.hld_start_date, y * 12) + d - 1, 'd' ) hld_week FROM ( SELECT a.hld_id , a.hld_name , a.hld_start_date , a.hld_end_date , a.hld_end_date - a.hld_start_date + 1 date_diff , NVL2( b.hlr_hld_id , TO_CHAR(sysdate, 'yyyy' ) - TO_CHAR(a.hld_start_date, 'yyyy' ) , 0) year_diff FROM holiday a LEFT OUTER JOIN holiday_repeat b ON a.hld_id = b.hlr_hld_id ) a , ( SELECT LEVEL d FROM dual CONNECT BY LEVEL <= 99) d , ( SELECT LEVEL - 1 y FROM dual CONNECT BY LEVEL <= 99) y WHERE d <= date_diff AND y <= year_diff ; |