데이터가 이상하게 들어와서 꼬이기 시작하네요,,
CONNECT BY PRIOR 로 TREE구조를 처리했었는데,
SEQ, DEPTH, PARENT_ID, MENU_ID, MENU_NAME, JUMP_YN
1 1 M M MENU N
2 2 M M1 MENU1 N
3 3 M1 M11 MENU11 N
4 3 M1 M12 MENU12 N
5 2 M M2 MENU2 N
6 3 M2 M21 MENU21 N
7 4 M21 M211 MENU211 N
8 3 M3 M31 MENU31 Y
9 4 M31 M311 MENU311 N
10 4 M41 M411 MENU411 Y
위 8, 10번째 로우처럼 상위값이 없는 로우 데이터가 들어오게 되었습니다.
이로인해 CONNECT BY PRIOR 시 하위 레벨들이 전부 안나오구요,,
위와 같은 데이터가 있을 경우 SEQ 8, 10번째 로우는 이전 LEVEL의 PARENT_ID값을 적용해서 TREE구조를 만들어야 합니다.
SEQ, LEVEL, PARENT_ID, MENU_ID, MENU_NAME
1 1 M M MENU
2 2 M M1 MENU1
3 3 M1 M11 MENU11
4 3 M1 M12 MENU12
5 2 M M2 MENU2
6 3 M2 M21 MENU21
7 4 M21 M211 MENU211
8 3 M2 M31 MENU31
9 4 M31 M311 MENU311
10 4 M31 M411 MENU411
위 데이터 8번 10번의 PARENT_ID처럼 만들어야 하는데, 바로 이전 DEPTH의 값으로 치환,,
방법이 있을까요??
-- 계층구조 전개 순서 그대로 seq 순서가 동일해야 하겠네요? -- 그렇지 않을 경우엔 풀수 없는 문제입니다. -- jump_yn 이라는 항목도 존재하는 항목인가요? 만들어 내신 건가요? -- 계층전개 쿼리 자체도 대용량에서는 성능이 좋은 편은 아닌데 -- 여기에 예외로직을 넣기 시작하면 성능을 보장할 수 없습니다. WITH t AS ( SELECT 1 seq, 1 depth, 'M' parent_id, 'M' menu_id, 'MENU' menu_name, 'N' jump_yn FROM dual UNION ALL SELECT 2, 2, 'M' , 'M1' , 'MENU1' , 'N' FROM dual UNION ALL SELECT 3, 3, 'M1' , 'M11' , 'MENU11' , 'N' FROM dual UNION ALL SELECT 4, 3, 'M1' , 'M12' , 'MENU12' , 'N' FROM dual UNION ALL SELECT 5, 2, 'M' , 'M2' , 'MENU2' , 'N' FROM dual UNION ALL SELECT 6, 3, 'M2' , 'M21' , 'MENU21' , 'N' FROM dual UNION ALL SELECT 7, 4, 'M21', 'M211', 'MENU211', 'N' FROM dual UNION ALL SELECT 8, 3, 'M3' , 'M31' , 'MENU31' , 'Y' FROM dual UNION ALL SELECT 9, 4, 'M31', 'M311', 'MENU311', 'N' FROM dual UNION ALL SELECT 10, 4, 'M41', 'M411', 'MENU411', 'Y' FROM dual ) SELECT seq , depth , DECODE(jump_yn , 'Y', (SELECT menu_id FROM t WHERE seq = (-- 결합인덱스(depth, seq) 필요함 -- SELECT MAX(seq) FROM t WHERE seq < a.seq AND depth = a.depth - 1 ) ) , 'N', parent_id) parent_id , menu_id , menu_name , jump_yn FROM t a ;