질문하나 드립니다. 0 10 1,811

by 호랭이횽 [2008.11.27 14:14:38]


<구조>

-------------------------------------------------------------------------------------

본사 ㅡ 생산부 ㅡ 생산1부

                          ㄴ 생산2부

                          ㄴ 생산3부

          ㄴ 영업부ㅡ 영업수주부

                           ㄴ 영업관리부 ㅡ 영업관리1부

                                                      ㅡ 영업관리2부

          ㄴ 품질관리부

-------------------------------------------------------------------------------------

본사 하위에 생산부,영업부,품질관리부가 있고

생산부에는 생산1,2,3부가

영업부에는 영업수주부,영업관리부가 있고 영업관리부 아래에 영업관리 1,2부가

품질관리부는 단독으로 되어있습니다

테이블 구조는 

테이릅 < dept>

dept_code  char(4)            -> 부서코드

dept_name varchar(30)   -> 부서명

dept_node char(4)            -> 상위부서

이런식으로 되어있습니다.

원하는 결과를 말씀드리자면

dept 테이블의 데이터 중에서 각 마지막 브랜치코드를 구하는 것입니다.

 

생산1,2,3부, 영업수주부,영업관리1,2부,품질관리부

이렇게만 나와야 하는 쿼리를 짜려고합니다.

start with로 level을 구해서 해보려 했는데 잘안되네요...

조언을 좀 부탁드려봅니다

 

-추가-

 -------------------------------------------------------------------------------------

예제 data 보여드리겠습니다.

dept

dept_code         dept_name        dept_node

0000                    본사                    
1000                    생산부                    0000
1100                    생산1부                  1000
1200                    생산2부                  1000
1300                    생산3부                  1000
2000                    영업부                    0000
2100                    영업수주부            2000
2200                    영업관리부            2000
2210                    영업관리1부          2200
2220                    영업관리2부          2200
3000                    품질관리부            0000

by 배고파 [2008.11.27 14:25:30]
dept_code 는 어떻 구조로 되어있는데요?

by 호랭이?O [2008.11.27 14:40:19]
dept_code 는 dept 테이블의 pk컬럼 입니다
'0001' 같이 숫자형 문자로 되어있어요.
dept_node 라고 하는 상위부서코드도 당연히 형식이 같구요

by 엄범정 [2008.11.27 14:43:17]
그럼 예를 들어서..
상위부서코드가 최상위이면 첫번째 숫자가 0이 아닌값이 들어가고..
쉽게 말하면 본사는 '1000' 두번째 상위부서는 '1100', '1200' 이런식으로 들어가는것가요? 세번째 상위부서는 '1110' '1210' ??

by 호랭이?O [2008.11.27 14:51:36]
맞습니다 범정님 그렇지만 코드 추가가 될수있기때문에 코드의 자리수(레벨에따른자릿수변화)가 절대적이지는 않습니다

by 도가니 [2008.11.27 16:16:32]
저도 실력이 아직이라 이런방법을...

select * from dept
where dept_code not in(
select dept_code from dept a
where exists(
select dept_code
from dept
where a.dept_code = dept_node
)
)
and dept_node is not null

by 마농 [2008.11.27 16:20:34]
WITH dept AS
(
SELECT '0000' dept_code, '본사' dept_name, '' dept_node FROM dual
UNION ALL SELECT '1000', '생산부' , '0000' FROM dual
UNION ALL SELECT '1100', '생산1부' , '1000' FROM dual
UNION ALL SELECT '1200', '생산2부' , '1000' FROM dual
UNION ALL SELECT '1300', '생산3부' , '1000' FROM dual
UNION ALL SELECT '2000', '영업부' , '0000' FROM dual
UNION ALL SELECT '2100', '영업수주부' , '2000' FROM dual
UNION ALL SELECT '2200', '영업관리부' , '2000' FROM dual
UNION ALL SELECT '2210', '영업관리1부', '2200' FROM dual
UNION ALL SELECT '2220', '영업관리2부', '2200' FROM dual
UNION ALL SELECT '3000', '품질관리부' , '0000' FROM dual
)
-- 10G 버전용 쿼리입니다.
SELECT *
FROM dept
WHERE CONNECT_BY_ISLEAF = 1
START WITH dept_node IS NULL
CONNECT BY PRIOR dept_code = dept_node

by 호야 [2008.11.27 16:24:30]
역시 10G 가 좋아.ㅠ..ㅠ 아아악~

by 호랭이?O [2008.11.27 16:33:31]
호야님, 도가니님, 마농님 감사합니다.
CONNECT_BY_ISLEAF 를 사용해서 간단하게 해결되는군요...
10g로 넘어왔음에도 불구하고 저런것은 알지도 못했습니다.
다시한번 감사드립니다 (__)

by 마농 [2008.11.27 16:37:39]

by 배고파 [2008.11.27 16:43:45]
짱구를 돌리고 있는데.. 늦었군용..
역시 대단들 하심니다..
호랭이 님 쿼리를 짧게 할수도 있더군요..
SELECT DEPT_CODE,DEPT_NAME,DEPT_NODE
FROM (
SELECT DEPT_CODE,DEPT_NAME,DEPT_NODE, LEAD(DEPT_NODE) OVER (ORDER BY ROWNUM) LEAD
FROM t
WHERE DEPT_NODE <> ' ')
WHERE DEPT_CODE <> NVL(LEAD,0)
아 심오한 쿼리.. ㅡ.ㅡ;;
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입