상위 기관 2개를 찾으려고 합니다. 0 12 874

by 푸릉이 [2017.09.21 10:32:41]


안녕하세요 구루비에서 많은 도움을 받고 있습니다.

with relation(bscode, upbscode, bsname) as 
(
    select 'aaaaa'  ,'aaaa'   ,'안전팀' from dual union all
    select 'aaaa'    ,'aaa'     ,'안전팀처' from dual union all
    select 'aaa'      ,'aa'       , '시설부' from dual union all
    select 'aa'        ,'a'         , '시설처' from dual union all
    select 'bbbbb'  ,'bbbb'   ,'위험팀' from dual union all
    select 'bbbb'    ,'bbb'     ,'위험팀처' from dual union all
    select 'bbb'      ,'bb'       , '자재부' from dual union all
    select 'bb'        ,'a'         , '자재처' from dual union all
    select 'a', null               ,'본사' from dual
) ,  insa (name, bscode, amt) as
(
    select 'Kevin', 'aaa', '1000' from dual union all 
    select 'Michael', 'bbbbb', '2000' from dual union all
    select 'Uncle', 'aaaaa', '4000' from dual
)
부모 자식 관계의 부서 데이터가 있고
인사정보에 부서코드가 들어있습니다.
출력할때 해당 부서부터 상위부서 2개를 더 찾아서 보여주고자 합니다.

이름       차상위부서     상위부서        부서      부서코드    금액
kevin         본사            시설처        시설부        aaa     1000
Michael    자재처           자재부        위험팀처     bbbb     2000
Uncle        시설부          안전팀처     안전팀        aaaaa    40000   

이런식으로..
 
 

by jkson [2017.09.21 12:32:50]
select a.name
, regexp_substr(b.nm,'[^,]+',1,3) updept1nm
, regexp_substr(b.nm,'[^,]+',1,2) updept2nm
, regexp_substr(b.nm,'[^,]+',1,1) deptnm
, a.bscode deptcd
, a.amt
from insa a,
(
select connect_by_root(bscode) code, sys_connect_by_path(bsname,',') nm 
from relation a
where connect_by_isleaf = 1
connect by prior upbscode = bscode
and level <= 3
) b
where a.bscode = b.code
order by 1

 


by 푸릉이 [2017.09.21 13:00:23]

connect_by_root
connect_by_isleaf = 1

이걸 활용할 생각을 못했네요 ㅠ
큰도움을 받았습니다.


by 푸릉이 [2017.09.21 13:38:44]

connect_by_isleaf

이부분 말인데요 자식이 없는 노드 즉 종단 노드로 기준으로 정렬하는데  중간단계인 bbbb에 대해서도 정렬이 되는 이유는 뭐죠?


by 김용한 [2017.09.21 13:43:04]

sys_connect_by_path 로는 4000바이트까지 가능하다고하더라구요


by jkson [2017.09.21 13:44:14]

무슨 말씀이신지 잘..;


by 김용한 [2017.09.21 13:48:15]

제말은 부서를 ,로 구분한 문자열을 구한다음

,를기준으로 1,2,3 번째 인덱스의 문자열을 가져오는방법에서는

만약 예를들어서 10000개를 가져와서 10000,9999,9998 가져와야한다면

10000개의 문자열이 4000바이트를 넘어서면 오류가떨어지지않을까해서요....


by 마농 [2017.09.21 14:15:56]

level <= 3 제한을 걸었네요.
차상위까지만 연결됩니다.
그 이상은 진행 안됩니다.


by 마농 [2017.09.21 13:09:27]
SELECT a.name    이름
     , c3.bsname 차상위부서
     , c2.bsname 상위부서
     , c1.bsname 부서
     , a.bscode  부서코드
     , a.amt     금액
  FROM insa a
     , relation c1
     , relation c2
     , relation c3
 WHERE c1.bscode(+) = a.bscode
   AND c2.bscode(+) = c1.upbscode
   AND c3.bscode(+) = c2.upbscode
;

 


by 김용한 [2017.09.21 13:33:48]

간단하네요 ㅡㅡ;;


by jkson [2017.09.21 13:56:34]

김용한님//  level 3까지만 가니 그럴 일은 없고요. 제가 한 방법은 조인을 최대한 줄이면 성능상 이점이 있지않을까 해서 만들어본 방법이예요ㅎㅎ


by 김용한 [2017.09.21 15:11:28]

네... ㅎㅎ


by 푸릉이 [2017.09.21 16:22:33]

제 의도랑 일치합니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입