본문 바로가기
데이터베이스

계층 쿼리

by 흰색남자 2023. 10. 3.

회사 recursive 절을 보다가 공부해봄.

CREATE TABLE employees (
    id INT PRIMARY KEY,
    name TEXT,
    manager_id INT REFERENCES employees(id)
);

INSERT INTO employees VALUES
(1, 'CEO', NULL),
(2, 'Manager A', 1),
(3, 'Manager B', 1),
(4, 'Employee 1', 2),
(5, 'Employee 2', 2),
(6, 'Employee 3', 3),
(7, 'sEmployee ', NULL),
(8, 'sEmployee A', 7),
(9, 'sEmployee B', 7),
(10, 'sEmployee 1', 4),
(11, 'sEmployee 2', 4),
(12, 'sEmployee 3', 5);


WITH RECURSIVE subordinates(id, name, manager_id, lv) AS (
    SELECT id, name, manager_id, 1
    FROM employees
    WHERE name = 'Manager A'  << 시작 쿼리
    UNION ALL
    SELECT e.id, e.name, e.manager_id, s.lv + 1
    FROM subordinates s, employees e
    where s.id = e.manager_id   << 계속 데이터를 쌓아가는 쿼리
)
SELECT * FROM subordinates;

결과

subordnates 테이블의 데이터 변화 과정 

1. 1번 레코드만 존재함

2. 2,3번째 레코드까지 존재함

3. 4,5,6 레코드가 존재함

재귀가 반복될수록 subordnates 테이블의 크기가 커지므로 where절의 속도가 느려진다. 그러므로 종료조건을 잘 설정해야한다.

예를들어 lv의 최대 값을 설정한다거나,,