postgreHierarchy在SQL中-显示节点下的所有元素



我有两个表:

  1. 包含element_code和parent_node
  2. 包含不同层次节点之间的关系

我想查看所有级别节点下的所有最低元素。

我写了这样的东西,结果,我有孩子,父母和指示器是一个LEAF。所以我可以选择节点,然后我将看到连接到这个节点的所有元素。如何循环它,不仅看到选定的水平上的元素,但在节点下的一切?

SELECT azienda_gerarchia_abbi.cod_azienda        AS CHILD, 
azienda_gerarchia_abbi.cod_azienda_eleger AS PARENT, 
azienda.desc_azienda0                     AS LABEL, 
'X'                                       AS LEAF 
FROM   azienda_gerarchia_abbi 
LEFT OUTER JOIN azienda 
ON azienda_gerarchia_abbi.cod_azienda = azienda.cod_azienda 
UNION 
SELECT cod_azienda_eleger       AS CHILD, 
cod_azienda_eleger_padre AS PARENT, 
desc_azienda_eleger0     AS LABEL, 
NULL                     AS LEAF 
FROM   azienda_gerarchia

例如:

结构模型级别仅用于解释。我们不把它存储在数据库中。

在Level 1中,节点1连接了元素1和元素2。

在节点1下,我们有节点3 -元素3和元素4节点4 -元素5和元素6

此外,在节点2下,我们有节点3,元素5和6

我的查询将返回:

查询结果

所以我可以选择每个节点,例如NODE2,我将看到两个元素和一个节点。

但正如预期的结果,我希望看到所有其他级别,在我的情况下元素3,4,5,6和Node4

In 1st table I have got:
>Element1 - Node1
>Element2 - Node1
>Element3 - Node2
>Element4 - Node2
>Element5 - Node3
>Element6 - Node3
>Element7 - Node4
>Element8 - Node4
In second:
>Node1-Node2
>Node1-Node3
>Node4-Node4

正如Blue Star所提到的,WITH RECURSIVE可能是您需要的工具。如果以SQL的形式提供一组样本数据,那么创建一个很好的示例会更容易。DBFiddle是设置测试环境的常用工具。包括CREATE TABLEINSERT语句

下面是我用来演示RECURSIVE查询的代码:

WITH RECURSIVE t AS
(   -- base case for recursion
SELECT aga.cod_azienda        AS CHILD 
, aga.cod_azienda_eleger AS PARENT 
, a.desc_azienda0        AS LABEL 
FROM azienda_gerarchia_abbi aga
LEFT JOIN azienda a ON aga.cod_azienda = a.cod_azienda 
UNION ALL -- recurse through children
SELECT aga.cod_azienda
, aga.cod_azienda_eleger
, a.desc_azienda0
FROM t prev
JOIN azienda_gerarchia_abbi nxt ON nxt.cod_azienda_eleger = prev.child
LEFT JOIN azienda a2 ON nxt.cod_azienda = a2.cod_azienda 
) SELECT *
FROM t
WHERE t.child IS NULL -- You can adjust the WHERE clause here to get only the leaf nodes by whichever means works for you.
;

最新更新