조직도쿼리를 만들던 도중 막히는 부분이 있어 고수님들의 도움을 받고자 글을 올립니다. 화면에서 트리모양으로 조직도를 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
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 ;
START
WITH
UP_DEPT_CD =
'ROOT'
CONNECT
BY
PRIOR
DEPT_CD = UP_DEPT_CD
ORDER
SIBLINGS
BY
SORT_SEQ
위 처럼 상위 조직을 start with 로 잡아주고, 하향식으로 조회 하는방식입니다.
START
WITH
DEPT_CD =
'하위코드'
CONNECT
BY
PRIOR
UP_DEPT_CD = DEPT_CD
ORDER
SIBLINGS
BY
SORT_SEQ