1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
| CREATE TABLE employees
(
employee_id serial PRIMARY KEY,
full_name VARCHAR NOT NULL,
manager_id INT
);
INSERT INTO employees (employee_id,
full_name,
manager_id)
VALUES (1, 'Michael North', NULL),
(2, 'Megan Berry', 1),
(3, 'Sarah Berry', 1),
(4, 'Zoe Black', 1),
(5, 'Tim James', 1),
(6, 'Bella Tucker', 2),
(7, 'Ryan Metcalfe', 2),
(8, 'Max Mills', 2),
(9, 'Benjamin Glover', 2),
(10, 'Carolyn Henderson', 3),
(11, 'Nicola Kelly', 3),
(12, 'Alexandra Climo', 3),
(13, 'Dominic King', 3),
(14, 'Leonard Gray', 4),
(15, 'Eric Rampling', 4),
(16, 'Piers Paige', 7),
(17, 'Ryan Henderson', 7),
(18, 'Frank Tucker', 8),
(19, 'Nathan Ferguson', 8),
(20, 'Kevin Rampling', 8);
-- 递归查询1 查询返回平的数据, 需要自己组装
with recursive subordinates AS (
SELECT employee_id,
manager_id,
full_name
FROM employees e
WHERE employee_id = 2
UNION
SELECT e.employee_id,
e.manager_id,
e.full_name
FROM employees e
INNER JOIN subordinates s ON s.employee_id = e.manager_id
)
SELECT *
FROM subordinates;
-- 函数递归法 传入一个root_id 即可
create
or replace function query(_id int) returns json as
$$
begin
return (
select jsonb_agg(r)
from (
SELECT *, query(e.employee_id) as children
FROM employees e
where e.manager_id = _id) as r);
end
$$
language plpgsql;
select query(2);
|