조직도 관련 문의드립니다 1 2 1,211

by 김코옹 [SQL Query] [2015.04.25 16:16:16]


캡처.JPG (23,629Bytes)

조직도쿼리를 만들던 도중 막히는 부분이 있어 고수님들의 도움을 받고자 글을 올립니다.
화면에서 트리모양으로 조직도를 3레벨까지 보여주도록 구현하다가 4레벨까지 보여주는방향으로 변경이 되었습니다

T0000 테스트법인 ROOT 1
KQ000 영업본부 T0000 2
KQ001 영업부서 KQ000 3
KQ002 영업1팀 KQ001 4
KQ003 영업2팀 KQ001 4
테이블구조는 이런식으로 되어있습니다.
이 중에 영업1팀이 사용안함으로 변경될 경우 검색조건에서 USE_YN = 'N'으로 검색하게 되는데 
영업1팀의 상위인 '영업부서'와 영업부서의 상위인 '영업본부' 그리고 최상위 ROOT가 조회되어야 합니다.
자신을 포함하여 바로위의 상위부서는 가져왔는데 그위에 상위까지는 어떤식으로 처리해야하는 어렵네요...


SELECT
       DEPT_CD,
       DEPT_NM,
       LEVL,
       UP_DEPT_CD,
       USE_YN,
       SORT_SEQ
  FROM (SELECT A.COMP_CD,
               (SELECT COMP_NM
                  FROM HR_COMP
                 WHERE COMP_CD = A.COMP_CD) AS COMP_NM,
               A.DEPT_CD,
               A.DEPT_NM || '[' || A.SORT_SEQ || ']' AS DEPT_NM,
               A.UP_DEPT_CD,
               A.SORT_SEQ,
               A.LEVL,
               A.DEPT_DIV,
               A.USE_YN
          FROM HR_DEPT A
               , (
                    SELECT A.DEPT_CD
                      FROM HR_DEPT A
                     WHERE A.COMP_CD = '4000'
                       AND A.DEPT_CD IN ((SELECT DEPT_CD FROM HR_DEPT
                                           WHERE COMP_CD = A.COMP_CD
                                             AND USE_YN LIKE '%' || 'Y' || '%'))
                    UNION ALL
                    SELECT A.DEPT_CD
                      FROM HR_DEPT A
                     WHERE A.COMP_CD = '4000'
                       AND A.DEPT_CD IN ((SELECT UP_DEPT_CD FROM HR_DEPT
                                           WHERE COMP_CD = A.COMP_CD
                                             AND USE_YN LIKE '%' || 'Y' || '%'))
                    UNION ALL
                    SELECT A.DEPT_CD
                      FROM HR_DEPT A
                     WHERE A.COMP_CD = '4000'
                       AND A.UP_DEPT_CD = 'ROOT'
                 ) B
         WHERE A.DEPT_CD = B.DEPT_CD
           AND COMP_CD = '4000'
       ) 
 START WITH UP_DEPT_CD = 'ROOT' 
 CONNECT BY PRIOR DEPT_CD = UP_DEPT_CD
 ORDER SIBLINGS BY SORT_SEQ

 

by 창조의날개 [2015.04.25 17:02:06]

WITH HR_DEPT(DEPT_CD, DEPT_NM, UP_DEPT_CD, LEVL, USE_YN, SORT_SEQ ) AS(
    SELECT 'T0000', '테스트법인', 'ROOT', '1', 'Y' , '1000' FROM DUAL UNION ALL
    SELECT 'KQ000', '영업본부', 'T0000', '2', 'Y' , '2400'  FROM DUAL UNION ALL
    SELECT 'KQ001', '영업부서', 'KQ000', '3', 'Y' , '2500'  FROM DUAL UNION ALL
    SELECT 'KQ002', '영업1팀', 'KQ001', '4', 'Y' , '2700'  FROM DUAL UNION ALL
    SELECT 'KQ003', '영업2팀', 'KQ001', '4', 'N' , '2800'  FROM DUAL
)
--SELECT LEVEL, DEPT_CD, DEPT_NM, LEVL, UP_DEPT_CD, USE_YN
SELECT LPAD(' ', 4*(LEVEL-1)) || DEPT_NM || '['|| SORT_SEQ || ']' AS DEPT_NM
FROM HR_DEPT
WHERE USE_YN = 'Y'
START WITH UP_DEPT_CD = 'ROOT'
CONNECT BY PRIOR DEPT_CD = UP_DEPT_CD
ORDER SIBLINGS BY SORT_SEQ
;

 


by 쿼리back [2015.04.27 10:34:52]
참고하세요, 김코옹 님이쓰신 방법은 하향식 방법이구요...
  SELECT * 
 FROM  HR_DEPT
 START WITH UP_DEPT_CD = 'ROOT'
 CONNECT BY PRIOR DEPT_CD = UP_DEPT_CD
 ORDER SIBLINGS BY SORT_SEQ
 
위 처럼 상위 조직을 start with 로 잡아주고, 하향식으로 조회 하는방식입니다.
상향식은... 아래처럼 start with 로 하위 조직을 잡아주고, 최상위로 조회하는 방식입니다.
이방법으로 선택한 부서의 상위 조직을 모두 가져 올 수 있습니다.
    
 SELECT * 
 FROM  HR_DEPT
 START WITH  DEPT_CD = '하위코드'
 CONNECT BY PRIOR UP_DEPT_CD = DEPT_CD
 ORDER SIBLINGS BY SORT_SEQ
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입