CONNECT BY PRIOR 질문입니다. 0 2 1,347

by 한결 [SQL Query] [2014.07.07 13:03:05]


데이터가 이상하게 들어와서 꼬이기 시작하네요,,

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의 값으로 치환,,

방법이 있을까요??

by 마농 [2014.07.07 14:09:53]
-- 계층구조 전개 순서 그대로 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
;

 


by 한결 [2014.07.07 14:19:28]

답변 감사합니다.

이미 가공된 데이터라 쿼리에서는 풀수 없는 문제인듯 하네요,,

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