Oracle 계층쿼리 관련 문의 드립니다.
구현하려는 내용은 이렇습니다. 사용자가 보유한 화면 ID를 기준으로 MenuTree 를 구성 해야 합니다.
사용자가 보유한 화면 ID 는 MenuTree 테이블에 최하위 레벨입니다. ( 사용자 화면 ID 는 상하위 관계 코드와 무관 )
순방향이 아닌 역방향으로 메뉴트리를 조회 합니다.
메뉴 테이블은 ( TBL_COMANM0001 ) 전체 메뉴 트리를 구성 하고 있습니다. 당연한 애기지만 계층구조 형태로 관리 되어집니다.
메뉴 테이블 속성값중 화면 ID 라는 값이 있으며 계층구조의 제일 마지막 Level 입니다.
사용자에게 화면 ID 값을 권한으로 부여 하게 됩니다. ( START WITH 절에 있는 서브쿼리가 이에 해당 합니다.)
구현 방법은
1. 사용자가 보유한 화면 ID 조회 ( START WITH 의 시작 )
2. 사용자가 보유한 화면 ID 로 계층정보 역방향 조회 으로 구현 했습니다.
위와 같은 방식으로 메뉴 트리를 구성 하게 되면 데이터 중복이 발생 하게 됩니다. (동일 메뉴에 화면이 N 개 붙어 있는경우 각각의 화면 ID 의 상위코드를 찾게됨)
SQL 정보는 아래와 같이 구현 했습니다. ( 이미지 파일을 못올리네요.. 실행결과도 올려 드려야 하는데;;;;)
말로 설명 하긴 어려운데
사용자가 보유한 id 가 동일 메뉴에 붙어 있는 화면 A, B, C 를 보유 하고 있는경우 (Level 은 4 까지)
실행결과는
A 에 계층구조 결과 4 Row(( 상위 3개, 화면 1개)
B 에 계층구조 결과 4 Row ( 상위 3개, 화면 1개)
B 에 계층구조 결과 4 Row ( 상위 3개, 화면 1개)
총 12개의 Row 가 튀어 나오게 됩니다. 일반적인 Tree 구조가 아니죠..--;;
원하는 형태는 A 화면에 대한 계층구조를 가져와 ( 4 row ) B (1 row ), C (1 row) 화면을 붙이는 형태입니다.
( A, B, C 순서는 상관없습니다. 동일메뉴 화면인경우 아무거나 1개만 Tree 정보만 있으면 되니깐요)
혹시 비슷한 내용 경험 해보신 있으신지 해서 문의 드립니다.
SELECT
LEVEL AS LVL ,
T1.ISRN_CORE_MENU_SUID AS ISRN_CORE_MENU_SUID ,
T1.ISRN_CORE_SCRN_SUID AS ISRN_CORE_SCRN_SUID ,
T1.HGRN_ISRN_CORE_MENU_SUID AS HGRN_ISRN_CORE_MENU_SUID ,
T1.ISRN_CORE_MENU_NM AS ISRN_CORE_MENU_NM
/*
SYS_CONNECT_BY_PATH(ISRN_CORE_MENU_NM, ' - ') AS PATH
CONNECT_BY_ROOT (ISRN_CORE_MENU_SUID),
CONNECT_BY_ROOT (HGRN_ISRN_CORE_MENU_SUID)
*/
FROM TBL_COMANM0001 T1
START WITH ISRN_CORE_SCRN_SUID IN (
/*
SubQuery 결과가 Level 4 에 해당하는 화면 ID 입니다.
*/
SELECT
C.ISRN_CORE_SCRN_SUID AS ISRN_CORE_SCRN_SUID
FROM TBL_COMANM0008 A INNER JOIN TBL_COMANM0007 B ON A.ISRN_CORE_ATRT_SUID = B.ISRN_CORE_ATRT_SUID
INNER JOIN TBL_COMANM0015 C ON B.ISRN_CORE_ATRT_SUID = C.ISRN_CORE_ATRT_SUID
WHERE A.EMNB = '1111112' -- Parameter1 Session 로그인id
AND A.ORGN_CODE = '10100' -- Parameter2 Session 기관코드
AND B.ISRN_CORE_ATRT_SUID = 3 -- Parameter3 Session 권한코드
)
CONNECT BY NOCYCLE PRIOR T1.HGRN_ISRN_CORE_MENU_SUID = T1.ISRN_CORE_MENU_SUID -- 하위에서 < 상위로
ORDER SIBLINGS BY T1.ISRN_CORE_MENU_SUID
|