[SQL] 연습 문제 모음5
2025. 3. 10. 14:14ㆍSQL
🔒 문제
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50),
hire_date DATE,
manager_id INT, -- 상사의 employee_id (NULL이면 최고 관리자)
department VARCHAR(50) -- 부서
);
-- 직원 데이터 삽입
INSERT INTO employees (employee_id, first_name, last_name, hire_date, manager_id, department) VALUES
(1, 'John', 'Doe', '2020-01-01', NULL, 'HR'), -- 최고 관리자 (상사가 없음)
(2, 'Jane', 'Smith', '2021-03-15', 1, 'HR'), -- John의 부하
(3, 'Emily', 'Wilson', '2022-02-01', 1, 'Finance'), -- John의 부하
(4, 'Michael', 'Johnson', '2021-06-01', 2, 'HR'), -- Jane의 부하
(5, 'Chris', 'Lee', '2022-07-01', 2, 'Finance'), -- Jane의 부하
(6, 'Sarah', 'Brown', '2023-01-01', 3, 'Finance'), -- Emily의 부하
(7, 'Tom', 'Hanks', '2023-02-01', 3, 'Finance'), -- Emily의 부하
(8, 'Linda', 'Davis', '2022-05-10', 4, 'HR');
특정 부서에 속한 직원들의 상사-부하 관계를 추적하고, 각 직원의 경로를 최고 관리자부터 해당 직원까지 추적합니다.
경로 추적에 대해 최대 3단계까지만 경로를 출력하시오.
예시: HR 부서의 모든 직원에 대해, 최고 관리자부터 해당 직원까지의 경로를 찾으세요.
🔓 내가 푼 답
더보기

WITH RECURSIVE hierarchy AS (
-- 초기값, 최고 권위자 행
SELECT employee_id, first_name, last_name, hire_date, manager_id, department, 1 AS level
FROM employees
WHERE department = 'HR' AND manager_id IS NULL -- 최고 관리자
UNION ALL
-- 반복 : 부하직원 구하기
SELECT e.employee_id, e.first_name, e.last_name, e.hire_date, e.manager_id, e.department, h.level + 1
FROM employees e
JOIN hierarchy h ON e.manager_id = h.employee_id
WHERE e.department = 'HR' AND h.level < 3 -- 경로 깊이가 3단계를 초과하지 않도록 제한
)
select group_concat(employee_id order by level,employee_id separator ' > ')
from hierarchy;
<결과>

✅ 사용 문법 정리
재귀 쿼리 WITH RESURSIVE~
# 1부터 5까지 출력
WITH RECURSIVE numbers AS (
-- 초기값: 1
SELECT 1 AS num
UNION ALL
-- 재귀적으로 숫자 증가
SELECT num + 1
FROM numbers
WHERE num < 5
)
SELECT num FROM numbers;
GROUP_CONCAT(expression [ORDER BY expression] [SEPARATOR separator])
: 여러 행을 하나의 문자열로 결합하는 기능
'SQL' 카테고리의 다른 글
| [LeetCode] 3451. Find Invalid IP Addresses (0) | 2025.03.10 |
|---|---|
| [LeetCode] 185. Department Top Three Salaries (0) | 2025.03.10 |
| [SQL] 문제 풀이 모음4 (0) | 2025.03.06 |
| [SQL] 연습 문제 모음3 (0) | 2025.03.04 |
| [SQL] 연습 문제 모음2 (0) | 2025.03.04 |