트리구조가 아닌 테이블로 parentId 만들기 0 2 1,555

by poodle [PL/SQL] 트리구조 parentId만들기 [2017.10.18 17:43:00]


안녕하세요~

현재 트리구조이긴 하나 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  
by 마농 [2017.10.18 18:35:18]
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
;

 


by poodle [2017.10.20 10:12:11]

답변 정말 감사드려요~ 

덕분에 다행히 원하는 결과를 뽑을수 있었습니다.

이게 오라클 버전 때문인지는 모르겠지만

LAST_VALUE(DECODE(lvl, 1, seq)) IGNORE NULLS OVER(ORDER BY seq) 이게 구문 오류라고 뜨네요

10g이구요 LAST_VALUE(DECODE(lvl, 1, seq) IGNORE NULLS) OVER(ORDER BY seq) 는 조회가 되네요

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입