根据 ltree 中最长的唯一路径从 postgres 数据库中获取唯一行

Fetch the unique rows from postgres database as per longest unique path in ltree

我正在处理数据库中的 postgres,我们在 table 下面有 PATH 列作为 ltree 用于存储层次结构 ID。

Table(位置)-

| ID(PK) |   User   |PATH (parent hierarchy) |
|--------|----------|---------|
|    1   |  Parent  |   null  |
|    2   |  Child-1 |   1     |
|    3   |  Child-2 |   1.2   |
|    4   |  Child-3 |   1.2.3 |
|    5   |  AParent |   null  |
|    6   |  AChild-2|   5     |
|    7   |  AChild-3|   5.6   |
|    8   |  AChild-4|   5.6   |

尝试了以下查询 -

select loc.user,STRING_TO_ARRAY(concat(loc.PATH::text,'.',loc.id),'.') as path
from location loc
WHERE LOC.NAME ilike '%child%';

结果-

|   ID   |   User   |   PATH  |
|--------|----------|---------|
|    2   |  Child-1 |{1,2}    |
|    3   |  Child-2 |{1,2,3}  |
|    4   |  Child-3 |{1,2,3,4}|
|    6   |  AChild-2|{5,6}    |
|    7   |  AChild-3|{5,6,7}  |
|    8   |  AChild-4|{5,6,8}  |

在这里你可以看到我们在 table 中有多个层次结构,但我想要唯一的层次结构直到叶子 例如

Hierarchy -1
A>B>C
Hierarchy -2
A>B>C>D`

预期结果应该是 -

   A>B>C>D

因为 A>B>C 也属于同一保护伞。 所以最终的 table 预期结果 -

|   ID   |   User   |   PATH   |
|--------|----------|----------|
|    4   |  Child-3 |{1,2,3,4} |
|    7   |  AChild-3|{5,6,7}   |
|    8   |  Child-4 |{5,6,8}   |

管理父子关系与显示用户层次结构的路径相同table。

如果还有其他需要,请告诉我。

您可以通过检查节点是否有任何后代来找到叶子:

select *
from location l1
where l1.path is not null
and not exists (
    select from location l2
    where l2.path <@ l1.path 
    and l2.path <> l1.path
    )
order by l1.id

db<>fiddle.

中测试

查询比实际情况更复杂,因为您对 ltree 的使用有些不合逻辑。根不应该是null,所有层次结构信息应该包含在ltree列中,而你不必将它与id.

混在一起