BAR*_*RNZ 3 sql postgresql recursive-query common-table-expression
我在树结构中有一个叶节点,我需要一个 Postgres 查询来递归遍历父节点以获得叶节点的完整路径。
我的表看起来像这样 - 问题是没有特定的根节点(即最顶层的经理最终互相报告)
+----+------------+-------+
| id | manager_id | name |
+----+------------+-------+
| 1 | 2 | Matt |
| 2 | 1 | Simon |
| 3 | 1 | John |
| 4 | 2 | Bob |
| 5 | 4 | Bill |
+----+------------+-------+
Run Code Online (Sandbox Code Playgroud)
对于像比尔这样的用户,(id=5)我正在寻找他们的报告线:
Matt > Simon > Bob > Bill(理想情况下,当它尝试前往已遍历的节点时,它会停在 Matt 处)
递归CTE就是您正在寻找的。
数据样本
CREATE TEMPORARY TABLE t
(id INT, manager_id INT, name TEXT);
INSERT INTO t VALUES
(1,2,'Matt'),(2,1,'Simon'),
(3,1,'John'),(4,2,'Bob'),
(5,4,'Bill');
Run Code Online (Sandbox Code Playgroud)
询问
WITH RECURSIVE man(a,b,c) AS (
SELECT manager_id, id,name FROM t
UNION
SELECT man.a, id,man.c FROM man, t
WHERE man.b = manager_id)
SELECT a,c FROM man
WHERE b = 5;
a | c
---+-------
4 | Bill
2 | Bob
1 | Simon
2 | Matt
(4 Zeilen)
Run Code Online (Sandbox Code Playgroud)
演示:db<>fiddle