안녕하세요~
현재 트리구조이긴 하나 parentId가 없는 테이블로 트리구조를 생성해야 하는상황입니다.
존재하는 컬럼은 seq, lvl, desc, amt 컬럼이 존재하구요 seq와 lvl로 부모 자식간의 관계를 설정합니다.
seq로 정렬을 한 표로 확인가능합니다.
아래 표를 보시면 seq 10,110이 lvl 1로 표의 최상위 레벨이고 seq10의 자식은 20,70, 20의 자식은 30,40,50,60입니다.
어떻게 해야 parentId를 만들 수 있을까요??
고수님들의 도움 부탁 드려요
Seq | lvl | desc | 수식 | amt | parentId |
10 | 1 | 봉급(1명) | 1,000,000 | ||
20 | 2 | 청원경찰(89명) | 400,000 | ||
30 | 3 | 경위(31호) | 100,000원*1명 | 100,000 | |
40 | 3 | 경사(28호) | 100,000원*1명 | 100,000 | |
50 | 3 | 경장(22호) | 100,000원*1명 | 100,000 | |
60 | 3 | 순경(10호) | 100,000원*1명 | 100,000 | |
70 | 2 | 임기제(1명) | 300,000 | ||
80 | 3 | 한시임기제(9급) | 100,000원*1명 | 100,000 | |
90 | 3 | 시간선택제임기제(마급-27시간) | 100,000원*1명 | 100,000 | |
100 | 3 | 시간선택제임기제(마급-29시간) | 100,000원*1명 | 100,000 | |
110 | 1 | 상여금 | 200,000 | ||
120 | 2 | 정근수당 | 200,000원*1 | 200,000 |
WITH t AS ( SELECT 10 seq, 1 lvl, '봉급(1명)' dsc, 1000000 amt FROM dual UNION ALL SELECT 20, 2, '청원경찰(89명)' , 400000 FROM dual UNION ALL SELECT 30, 3, '경위(31호) 100,000원*1명' , 100000 FROM dual UNION ALL SELECT 40, 3, '경사(28호) 100,000원*1명' , 100000 FROM dual UNION ALL SELECT 50, 3, '경장(22호) 100,000원*1명' , 100000 FROM dual UNION ALL SELECT 60, 3, '순경(10호) 100,000원*1명' , 100000 FROM dual UNION ALL SELECT 70, 2, '임기제(1명)' , 300000 FROM dual UNION ALL SELECT 80, 3, '한시임기제(9급) 100,000원*1명' , 100000 FROM dual UNION ALL SELECT 90, 3, '시간선택제임기제(마급-27시간) 100,000원*1명', 100000 FROM dual UNION ALL SELECT 100, 3, '시간선택제임기제(마급-29시간) 100,000원*1명', 100000 FROM dual UNION ALL SELECT 110, 1, '상여금' , 200000 FROM dual UNION ALL SELECT 120, 2, '정근수당 200,000원*1' , 200000 FROM dual ) -- 1. Join & Group by SELECT a.seq, a.lvl, a.dsc, a.amt , MAX(b.seq) p_seq FROM t a , t b WHERE b.seq(+) < a.seq AND b.lvl(+) = a.lvl - 1 GROUP BY a.seq, a.lvl, a.dsc, a.amt ORDER BY seq ; -- 2. Decode & Last_Value SELECT seq, lvl, dsc, amt , DECODE( lvl , 2, LAST_VALUE(DECODE(lvl, 1, seq)) IGNORE NULLS OVER(ORDER BY seq) , 3, LAST_VALUE(DECODE(lvl, 2, seq)) IGNORE NULLS OVER(ORDER BY seq) -- , 4, LAST_VALUE(DECODE(lvl, 3, seq)) IGNORE NULLS OVER(ORDER BY seq) ) p_seq FROM t ORDER BY seq ;