메뉴 트리구조에 관해서.. (예전에 누가 올리신게 있던데 거기에 추가 질문입니다.) 0 2 3,381

by 이정수 [2011.03.01 10:28:17]


제목 없음.png (12,627Bytes)


메뉴 트리구조 쿼리를 찾다가 예전에 어떤 분계서 트리구조에 대해서 올리신게 있었는데 마농님께서 답변해주신대로 처리해서 잘 활용을 했는데요..

문제는 그 트리구조에서 특정값을 where절 조건에 입력하게 되면 그 값에 해당하는 상위, 하위를 다 찾아야 하는 경우가 발생하게 되더군요..(프로젝트에서 메뉴관리 프로그램을 만들게 되다 보면, 메뉴명이나 메뉴 id를 가지고 조회할경우가 발생을 하기 때문에..)

그런 케이스에는 어떻게 처리를 해야 할지 모르겠습니다. where절에 특정 값이 조회 조건으로 걸렸을 경우 해당하는 값의 하위 노드가 있으면 하위 노드 트리까지 전부, 조회조건이 하위메뉴이면 해당하는 상위 메뉴를 찾아서 트리를 만들어야 하는 케이스가 발생을 하는거지요..;;

그림과 같은 케이스가 있다고 할때 공통이라고 검색하면 최상위 공통관리부터 하위의 모든 노드들이 조회가 되어야 하고, 시스템이라고 검색하게 되면 공통관리-일정관리-시스템점검일정 이런식의 트리가 만들어져야 하는 케이스가 발생합니다. 이런 케이스는 어떻게 처리가 되어야 할 지 궁금합니다..
by finecomp [2011.03.01 23:57:53]
코멘트 정도만...자세한 적용은 직접 해 보시길...;

일단 전개는 조건에 맞는 데이터들에 대해 상향, 하향 두 번 해야합니다.
이 때, 두 집합을 합하면서 중복을 제거하고 적절히 정렬을 해야할 수도 있는데, 테이블에 어떤 데이터들을 관리하고 있느냐에 따라 쿼리가 달라질 수 있습니다.

by 마농 [2011.03.02 08:53:37]
WITH t AS
(
SELECT '200' cd, '공통관리' nm, '' pcd FROM dual
UNION ALL SELECT '210', '기준정보관리' , '200' FROM dual
UNION ALL SELECT '220', '프로그램관리' , '200' FROM dual
UNION ALL SELECT '221', '프로그램모듈등록', '220' FROM dual
UNION ALL SELECT '222', '프로그램메뉴등록', '220' FROM dual
UNION ALL SELECT '230', '권한관리' , '200' FROM dual
UNION ALL SELECT '231', '사용자관리' , '230' FROM dual
UNION ALL SELECT '240', '일정관리' , '200' FROM dual
UNION ALL SELECT '243', '시스템일정관리' , '240' FROM dual
UNION ALL SELECT '250', '시스템관리' , '200' FROM dual
UNION ALL SELECT '251', '백업관리' , '250' FROM dual
)
-- 최종 트리 구성
SELECT *
FROM
(
-- 상위 메뉴 조회 --
SELECT cd, nm, pcd
FROM t
START WITH nm LIKE '%시스템%'
CONNECT BY cd = PRIOR pcd
UNION -- 통합 및 중복 제거
-- 하위 메뉴 조회 --
SELECT cd, nm, pcd
FROM t
START WITH nm LIKE '%시스템%'
CONNECT BY PRIOR cd = pcd
)
START WITH pcd IS NULL
CONNECT BY PRIOR cd = pcd
;
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입