상하위부서 계층형 출력 관련하여 문의 드립니다.
DEPTCODE |
DEPTNAME |
P_DEPTCODE |
SEQ |
00100 |
총괄부 |
00000 |
0 |
00003 |
생산부 |
00100 |
20 |
00124 |
전산팀 |
00003 |
10 |
00125 |
생산팀 |
00003 |
10 |
01028 |
운영지원 |
00125 |
40 |
00004 |
인사부 |
00100 |
20 |
DEPT_TABLE 부서테이블(SEQ는 하위부서가 숫자가 더 낮을수도 있음.)
DEPTCODE |
USERID |
00100 |
A001 |
00100 |
B001 |
00003 |
B002 |
01028 |
A002 |
01028 |
C003 |
ADMIN_TABLE 부서별 관리자 테이블(한 부서당 여러명의 담당자가 존재할 수 있음.)
USERID |
USERNAME |
A001 |
shelley |
A002 |
susan |
B001 |
david |
B002 |
hann |
C003 |
bruce |
USER_TABLE 관리자정보 테이블
추출하고자 하는 데이터 형태
LEVEL |
DEPTCODE |
DEPTNAME |
SEQ |
USERID |
USERNAME |
1 |
00100 |
총괄부 |
0 |
A001 |
shelley |
1 |
00100 |
총괄부 |
0 |
B001 |
david |
2 |
00003 |
생산부 |
20 |
B002 |
hann |
3 |
00124 |
전산팀 |
10 |
|
|
3 |
00125 |
생산팀 |
10 | ||
4 |
01028 |
운영지원 | 40 |
A002 |
susan |
4 |
01028 |
운영지원 | 40 |
C003 |
bruce |
2 |
00004 |
인사부 | 20 |
LEVEL은 유지하면서 USERID 가 여러개일 경우에 같이 출력될 수 있는 방법이 무엇이 있나요?
DEPT_TABLE에 LEVEL을 주고, 그 후에 USER_TABLE을 조인했더니
LEVEL이 흐트러집니다 ㅠㅠ
도움 부탁 드립니다.
1. ROWNUM 으로 정렬하시면 됩니다.
2. seq 의 역할이 있는지 모르겠네요?
- 정렬용이라면? 같은 부모를 가진 자식끼리 값이 달라야 할텐데? 그렇지도 않고?
WITH dept_table AS ( SELECT '00100' deptcode, '총괄부' deptname, '00000' p_deptcode, 0 seq FROM dual UNION ALL SELECT '00003', '생산부' , '00100', 20 FROM dual UNION ALL SELECT '00124', '전산팀' , '00003', 10 FROM dual UNION ALL SELECT '00125', '생산팀' , '00003', 10 FROM dual UNION ALL SELECT '01028', '운영지원', '00125', 40 FROM dual UNION ALL SELECT '00004', '인사부' , '00100', 20 FROM dual ) , admin_table AS ( SELECT '00100' deptcode, 'A001' userid FROM dual UNION ALL SELECT '00100', 'B001' FROM dual UNION ALL SELECT '00003', 'B002' FROM dual UNION ALL SELECT '01028', 'A002' FROM dual UNION ALL SELECT '01028', 'C003' FROM dual ) , user_table AS ( SELECT 'A001' userid, 'shelley' username FROM dual UNION ALL SELECT 'A002', 'susan' FROM dual UNION ALL SELECT 'B001', 'david' FROM dual UNION ALL SELECT 'B002', 'hann' FROM dual UNION ALL SELECT 'C003', 'bruce' FROM dual ) SELECT a.lv , a.deptcode , a.deptname , a.p_deptcode , a.seq , b.userid , c.username FROM (SELECT ROWNUM rn , LEVEL lv , deptcode , LPAD(' ', LEVEL-1, ' ') || deptname deptname , p_deptcode , seq FROM dept_table START WITH p_deptcode = '00000' CONNECT BY PRIOR deptcode = p_deptcode ORDER SIBLINGS BY deptcode ) a , admin_table b , user_table c WHERE a.deptcode = b.deptcode(+) AND b.userid = c.userid(+) ORDER BY a.rn, b.userid ;