database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 41787 게시물 읽기
No. 41787
Oracle 계층쿼리 관련 문의 드립니다.
작성자
떡종이
작성일
2020-03-04 19:37
조회수
9,106

 

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

 

 

 

 

 

이 글에 대한 댓글이 총 2건 있습니다.

SELECT *
  FROM (SELECT DISTINCT
               isrn_core_menu_suid
             , isrn_core_scrn_suid
             , hgrn_isrn_core_menu_suid
             , isrn_core_menu_nm
          FROM tbl_comanm0001
         START WITH isrn_core_scrn_suid
            IN (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'
                   AND a.orgn_code           = '10100'
                   AND b.isrn_core_atrt_suid = 3
                )
         CONNECT BY PRIOR hgrn_isrn_core_menu_suid = isrn_core_menu_suid
        )
 START WITH hgrn_isrn_core_menu_suid IS NULL
 CONNECT BY hgrn_isrn_core_menu_suid = PRIOR isrn_core_menu_suid
 ORDER SIBLINGS BY isrn_core_menu_suid
;

1,2단계 이후에 3,4단계 추가하세요.
1. 사용자가 보유한 화면 ID 조회
2. 1의 결과를 시작조건으로 계층 역전개
3. 2의 결과를 중복제거
4. 3의 결과를 토대로 최상위부터 계층 순전개

마농(manon94)님이 2020-03-05 11:50에 작성한 댓글입니다.

마농님 답변 감사합니다. 

 

핵심은 DISTINCT 로 중복을 제거하는거 였군요..

 

항상 루틴하게 쿼리 작성 하다보니 쉽게 풀릴 부분인데도 불구하고 어렵게 다가오네요

 

덕분에 수월하게 처리 했습니다.

 

다시 한번 도움 주셔서 감사합니다

 

 

떡종이(kjd2817)님이 2020-03-05 16:10에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
41791속도 개선 관련 문의 드립니다. [5]
이상영
2020-04-06
2478
41789오라클완전초짜질문 [5]
조희정
2020-03-09
2284
41788조건절에 IN 절 과 조건을 아예 안쓰는 것. [5]
궁금이
2020-03-06
2275
41787Oracle 계층쿼리 관련 문의 드립니다. [2]
떡종이
2020-03-04
9106
41786sqlplus 삭제 시 [1]
김현우
2020-02-27
4839
41785ORA-12505에러 [4]
신승익
2020-02-12
2733
41784Running 중인 DB session에 selesct 쿼리 이슈 문의 [4]
그레이트김
2020-02-10
2421
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.047초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다