(几乎)邻接postgres表混淆了关系

时间:2017-06-05 09:39:07

标签: postgresql common-table-expression

我有一个(几乎)邻接列表postgres表,它使用如下关系:

 Id.A   Id.B
   1    4
   2    3
   1    5
   5    6
   7    8
   3    4
   5    7

,并提供:

    1
   / \
  5   4
 / \   \
6   7   3
     \   \
      8   2

我希望找到值最小的节点。它不一定是根,因为它并不存在。我需要以某种方式从任何点遍历图形并找到具有最小值的节点。问题在于目前的情况,而不是每个人说的邻接表。

我很确定这必须使用递归CTE,但不知道从哪里开始。

而且,我认为我在这里可能不太清楚,有很多这些图都在同一个表中混淆,而不仅仅是一个图,所以对于每一行,它需要遍历它自己的图找到自己的最小值节点。

非常感谢任何帮助,谢谢。

1 个答案:

答案 0 :(得分:0)

根节点是id.b中没有显示的唯一节点,所以让我们从那里开始递归:

WITH RECURSIVE roots(root, child) AS (
      SELECT a, a FROM id
      EXCEPT
      SELECT b, b FROM id
   UNION ALL
      SELECT r.root, id.b
      FROM roots r
         JOIN id ON r.child = id.a
) SELECT root, child FROM roots;