재귀쿼리 0 2 634

by 구루구루구루 [Oracle 기초] [2019.06.03 15:24:54]


2018년에 입사한 사원 중에 부서가 회계팀인 사원의 최종 사수를 구하려고 합니다.

Employee 테이블
| emp_no | emp_name | dept | ent_year | manager_no |
| 18001   | 김땡땡       | 회계 | 2018      | 17001         |
| 18002   | 이땡땡       | 인사 | 2018      | 17001         |
| 17001   | 박땡땡       | 회계 | 2017      | 15001         |
| 15001   | 최땡땡       | 회계 | 2018      | 02003         |
| 02003   | 한땡땡       | 회계 | 2018      |                  |
.....

이런식으로 테이블이 있을 때, 다음과 같이 manage_no가 null인 경우까지 찾아서 최종사수를 구하려고합니다.

| emp_no | emp_name | manager_no | manage_no |
| 18001   | 김땡떙       | 02003         | 한땡떙       |


재귀쿼리를 써야하는지, case when 같은 함수를 써야하는지 잘 모르겠습니다. 
어떻게 쿼리를 짜야하나요?ㅠㅠ
 

by 랑에1 [2019.06.03 16:08:41]
-- http://www.gurubee.net/lecture/1903 
WITH T(emp_no, emp_name, dept, ent_year, manager_no) AS (
SELECT '18001', '김땡땡', '회계', '2018', '17001' FROM dual UNION ALL 
SELECT '18002', '이땡땡', '인사', '2018', '17001' FROM dual UNION ALL
SELECT '17001', '박땡땡', '회계', '2017', '15001' FROM dual UNION ALL
SELECT '15001', '최땡땡', '회계', '2018', '02003' FROM dual UNION ALL
SELECT '02003', '한땡땡', '회계', '2018', '' FROM dual 
)

SELECT LPAD(' ', 4*(LEVEL-1)) || emp_name emp_name, emp_no,
CONNECT_BY_ROOT  emp_no "Root emp_no", level
  FROM T
  WHERE dept = '회계'
 START WITH manager_no IS NULL 
CONNECT BY PRIOR emp_no=manager_no;

 


by 마농 [2019.06.03 19:59:45]

결과가 좀 이상한데요?
"2018년에 입사한 사원 중에 부서가 회계팀인 사원"은 총 3명인데? 결과는 왜 1건이죠?
혹시 최땡땡과 한땡땡의 입사년도 '2018' 은 오타인가요?

WITH t(emp_no, emp_name, dept, ent_year, manager_no) AS
(
SELECT '18001', '김땡땡', '회계', '2018', '17001' FROM dual UNION ALL
SELECT '18002', '이땡땡', '인사', '2018', '17001' FROM dual UNION ALL
SELECT '17001', '박땡땡', '회계', '2017', '15001' FROM dual UNION ALL
SELECT '15001', '최땡땡', '회계', '2015', '02003' FROM dual UNION ALL -- 오타 수정
SELECT '02003', '한땡땡', '회계', '2002', ''      FROM dual           -- 오타 수정
)
SELECT CONNECT_BY_ROOT(emp_no  ) emp_no
     , CONNECT_BY_ROOT(emp_name) emp_name
     , emp_no   manager_no
     , emp_name manager_name
  FROM t
 WHERE CONNECT_BY_ISLEAF = 1
 START WITH ent_year = '2018' AND dept = '회계'
 CONNECT BY PRIOR manager_no = emp_no
;

 

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