Sql Postgres递归查询-获取给定叶节点的根路径

Sql Postgres递归查询-获取给定叶节点的根路径,sql,postgresql,common-table-expression,recursive-query,Sql,Postgresql,Common Table Expression,Recursive Query,我在树结构中有一个叶节点,我需要一个Postgres查询来递归遍历父节点,以获得我的叶节点的完整路径 我的表是这样的-问题是没有特定的根节点(即,最高层的管理者最终会相互报告) 给定一个用户,如Bill(id=5),我正在追踪他们的报告行: Matt>Simon>Bob>Bill(理想情况下,当它试图转到已遍历的节点时,它只会在Matt处停止)您正在寻找递归 数据样本 CREATE TEMPORARY TABLE t (id INT, manager_id INT, name TEXT); I

我在树结构中有一个叶节点,我需要一个Postgres查询来递归遍历父节点,以获得我的叶节点的完整路径

我的表是这样的-问题是没有特定的根节点(即,最高层的管理者最终会相互报告)

给定一个用户,如Bill
(id=5)
,我正在追踪他们的报告行:

Matt>Simon>Bob>Bill
(理想情况下,当它试图转到已遍历的节点时,它只会在Matt处停止)

您正在寻找递归

数据样本

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');
质疑

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');
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)