根据 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
中测试
查询比实际情况更复杂,因为您对 ltree
的使用有些不合逻辑。根不应该是null
,所有层次结构信息应该包含在ltree
列中,而你不必将它与id
.
混在一起
我正在处理数据库中的 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
中测试
查询比实际情况更复杂,因为您对 ltree
的使用有些不合逻辑。根不应该是null
,所有层次结构信息应该包含在ltree
列中,而你不必将它与id
.