如何获得PostgreSQL中最顶级的父级

wer*_*ach 7 postgresql

我有一个带有列的树结构表:id,parent,name.给定树A-> B-> C,如何根据C的ID获得最顶层的父A的ID?特别是如何用"with recursive"编写SQL?谢谢!

mdm*_*dma 4

要实现递归查询,您需要公共表表达式(CTE)。此查询计算所有父节点的祖先。由于我们只想要顶层,因此我们选择 level=0。

WITH RECURSIVE Ancestors AS
(
   SELECT id, parent, 0 AS level FROM YourTable WHERE parent IS NULL
   UNION ALL
   SELECT child.id, child.parent, level+1 FROM YourTable child INNER JOIN
      Ancestors p ON p.id=child.parent

)
SELECT * FROM Ancestors WHERE a.level=0 AND a.id=C
Run Code Online (Sandbox Code Playgroud)

如果您想获取所有数据,请在 id 上使用内部联接,例如

SELECT YourTable.* FROM Ancestors a WHERE a.level=0 AND a.id=C
   INNER JOIN YourTable ON YourTable.id = a.id
Run Code Online (Sandbox Code Playgroud)