쿼리질문 / 초짜 머리속이 멍해지는 요구사항... -_- 0 12 1,552

by 김세환 [2009.01.14 12:27:25]


안녕하세요.

 다음과 같은 테이블이 있습니다.

'담당구역할당' 테이블이라고 하겠습니다.

부서코드 담당구역
000001502 서초구
000001441 강남구
000001506 노원구
000002031 강북구
000001001 경기도 용인시 기흥구

 

그리고 '부서정보' 테이블이 있는데  

부서코드 부서명 상위부서코드
000000001 ABC회사 null
000001502 KKK팀 000004801
000004801 MMM사업부 000001102
000001102 AAA사업본부 000000001
000001505 POP팀 000004801
: : :

이러한 구조로 되어 있습니다.

'담당구역할당' 테이블의 데이터와 '부서정보' 테이블을 가지고

부서명 담당구역 상위부서명
KKK팀 서초구 MMM사업부
MMM사업부 null AAA사업본부
AAA사업본부 null ABC회사
     
     
     

위와 같은 데이터를 뽑아낼 수 있을까요?

 

즉, 담당구역할당 테이블의 데이터를 기준으로 상위부서를 계층적으로 싹 다 가져올 수 있도록...

상위부서에서도 담당구역이 있다면 당연히 null 대신 해당 값이 보여야 합니다.

다음을 트리라고 가정합니다. A하위에 B,C..

B하위에 D,E

C하위에 F,G

        A

  B          C

D E      F G

여기서 담당구역은 C,D,E,G 에서 가지고 있다고 하면

A,B,C,D,E,G 에 대한 정보를 뿌려줘야 합니다.

어떻게 하는 것이 좋을까요... ㅜㅜ

 

도와주세요..

by 부락 [2009.01.14 12:52:46]
select b.부서명,a.담당구역,b.상위부서코드
from 담당구역할당 a, 부서정보 b
where a.부서코드=b.부서코드

by 부락 [2009.01.14 12:53:27]
이걸원하시는건가요..

by 김세환 [2009.01.14 12:59:35]
부락님 답변 감사합니다.
하지만 그건 아니구요... 담당구역할당 테이블에 있는 데이터를 토대로
계층적으로 나와야 합니다.

담당구역할당 테이블에서 D라는 부서 값이 있다면,
D부서명과 담당구역명, 상위부서명을 먼저 보여주고 이거와 연결되서
D부서의 상위부서들이 줄줄이 나오는 형태...를 말합니다.

물론 상위부서들이 담당구역 배정이 안되어있다면 담당구역값에 null 이 나오겠지요...

by 호야 [2009.01.14 13:05:34]
워메 길다 길어

WITH T AS (
SELECT '000000001' DEPT, 'ABC회사' DEPTNAME, '' UPDEPT FROM DUAL UNION ALL
SELECT '000001502', 'KKK팀', '000004801' FROM DUAL UNION ALL
SELECT '000004801', 'MMM사업부', '000001102' FROM DUAL UNION ALL
SELECT '000001102', 'AAA사업본부', '000000001' FROM DUAL UNION ALL
SELECT '000001505', 'POP팀', '000004801' FROM DUAL
),T2 AS(
SELECT '000001502' DEPT, '서초구' AREA FROM DUAL
)
SELECT T.DEPTNAME 부서명,T2.AREA 담당구역,
(SELECT B.DEPTNAME FROM T B WHERE T.UPDEPT=B.DEPT) 상위부서명
FROM T,T2
WHERE T.DEPT=T2.DEPT(+)
AND T.DEPT<>'000000001'
START WITH T.DEPT='000001502'
CONNECT BY PRIOR T.UPDEPT= T.DEPT

by 김세환 [2009.01.14 13:30:48]
호야님 답변 감사합니다..;;
start with t.dept = '000001502'
부분이 저렇게 명시가 되어서는 안됩니다.

원하는 결과는 특정부서의 상위를 모두 뽑아오는 것이 아니라;;

담당구역 테이블의 데이터를 기준으로 싹 다~ 가져오는것이라서요...

즉... 담당구역 서초구인 부서와 그 상위 쭈루룩...
담당구역 강남구와 그 상위 쭈루룩...
이런식으로 담당구역 테이블의 모든 데이터와 그놈을 기초로한 상위의 정보들이 쫙~~


start with t.dept = '000001502' <-- 요게 담당구역테이블의 부서코드값으로
한번씩 싹 바뀌어서 돌고 그걸 union을 하던 해야된다는건데

이게 가능한지조차 잘 모르겠습니다 -_-;;;

by 호야 [2009.01.14 13:55:25]
START WITH T.DEPT='000001502'
이렇게 변경 해 보세요
START WITH T.DEPT IN (SELECT DEPT FROM T2)

by 마농 [2009.01.14 14:07:36]
담당구역 테이블을 기초로 계층적으로 나온다면
최상위 부서인 ABC회사는 여러번 중복되어 나오게 되겠네요? 맞습니까?

by 김세환 [2009.01.14 14:55:01]
헉 마농님! 맞습니다... 중복되서 여러번 나오지요.
마농님께서 다른데다 올리신 LAG 함수 써서 하는 방법으로
연구중인데 무지 어렵네요...;

by 김세환 [2009.01.14 14:56:07]
참 10g R2 입니다...;

by 마농 [2009.01.14 15:09:03]
WITH area_t AS
(
SELECT '000001502' dept_cd, '서초구' part_area FROM dual
UNION ALL SELECT '000001441', '강남구' FROM dual
UNION ALL SELECT '000001506', '노원구' FROM dual
UNION ALL SELECT '000002031', '강북구' FROM dual
UNION ALL SELECT '000001001', '경기도 용인시 기흥구' FROM dual
)
, dept_t AS
(
SELECT '000000001' dept_cd, 'ABC회사' dept_nm, null p_dept_cd FROM dual
UNION ALL SELECT '000001502', 'KKK팀' , '000004801' FROM dual
UNION ALL SELECT '000004801', 'MMM사업부' , '000001102' FROM dual
UNION ALL SELECT '000001102', 'AAA사업본부', '000000001' FROM dual
UNION ALL SELECT '000001505', 'POP팀' , '000004801' FROM dual
)
SELECT a.dept_nm
, c.part_area
, b.dept_nm
FROM dept_t a, dept_t b, area_t c
WHERE a.p_dept_cd = b.dept_cd
AND a.dept_cd = c.dept_cd(+)
START WITH a.dept_cd IN (SELECT dept_cd FROM area_t)
CONNECT BY a.dept_cd = PRIOR a.p_dept_cd
;

by 호야 [2009.01.14 15:33:36]
결국 내 말은 십혔구나.ㅠ..ㅠ

by 김세환 [2009.01.14 17:12:23]
허걱;; 십히다니요... ^^;;

호야님 댓글 보고 방법 적고 (바로 해볼수 없는 환경임 ㅡㅡ;;)
마농님 댓글에 답글 달고
잘 되는 것을 확인하고...

와서 보니 마농님이 다시 답변을 달아주셨네요.

두분 다 99% 동일한 답을 주셨고 잘 됩니다.
답을 알고보니 또 은근 단순(?) 하네요. 역시 고수들의 세계란... ㅡ.ㅡ;;

START WITH T.DEPT IN (SELECT DEPT FROM T2)

이것이 되는지 몰랐습니다. -ㅁ-;; 변수처리를 받고 실행시점에 돌릴까 등등 고민 마니했음 ㅠㅠ

호야님 마농님 모두 감사합니다. 큰 도움이 되었습니다. :)

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