我如何获得所有出现的层次结构数据?

问题描述 投票:0回答:1

在我的PostgreSQL数据库(version: 11.4)中,有一个名为organizations的表。该表具有以下结构:

| organization_id | organization_name | parent_organization_id | tree_organization_id | organization_rang |
|-----------------|-------------------|------------------------|----------------------|-------------------|
| 1               | Alphabet          |                        | \1                   | 1                 |
| 2               | Google            | 1                      | \1\2                 | 2                 |
| 3               | Calico            | 1                      | \1\3                 | 2                 |
| 4               | Youtube           | 2                      | \1\2\4               | 3                 |
| 5               | Nest              | 2                      | \1\2\5               | 3                 |
| 6               | Facebook          |                        | \6                   | 1                 |
| 7               | Whatsapp          | 5                      | \6\7                 | 2                 |
| 8               | Instagram         | 5                      | \6\8                 | 2                 |

您可以看到该表存储了有关组织之间的层次关系的信息。假设输入具有特定的organization_id值。例如,可以是4(Youtube)。我需要创建一个名为dependencies的新列,其中将存储所有具有组织ID的tree_organization_id。此新列的数据类型必须为string array []text

换句话说,我正在尝试获得类似的结果:

| organization_id | organization_name | parent_organization_id | tree_organization_id | organization_rang | dependencies              |
|-----------------|-------------------|------------------------|----------------------|-------------------|---------------------------|
| 1               | Alphabet          |                        | \1                   | 1                 | ['\1', '\1\2', '\1\2\4' ] |
| 2               | Google            | 1                      | \1\2                 | 2                 | ['\1\2', '\1\2\4']        |
| 4               | Youtube           | 2                      | \1\2\4               | 3                 | ['\1\2\4']                |

我使用这样的SQL请求来查找组织的上级,但是如何正确计算dependencies列中的值?

with recursive hierarchy as (
    select
        organizations.organization_id,
        organizations.organization_name,
        organizations.parent_organization_id,
        organizations.tree_organization_id,
        organizations.organization_rang
    from
        organizations
    and
        organizations.organization_id in (4)
    union
    select
        a.organization_id,
        a.organization_name,
        a.organization_rang,
        a.parent_organization_id,
        a.tree_organization_id
    from
        organizations a
    inner join
        hierarchy b
    on
        a.organization_id = b.parent_organization_id
)
select
    hierarchy.organization_id,
    hierarchy.organization_name,
    hierarchy.parent_organization_id,
    hierarchy.tree_organization_id,
    hierarchy.organization_rang
from
    hierarchy
order by
    hierarchy.organization_rang;
sql postgresql hierarchy
1个回答
1
投票

如果我理解正确,则不需要递归CTE。您可以只在tree列上进行匹配:

select o.*,
       (select array_agg(o2.tree order by o2.rang)
        from organizations o2
        where o2.tree like (o.tree || '%')
       ) as dependencies
from organizations o;

Here是db <>小提琴。

请注意,我将反斜杠更改为正斜杠。反斜杠是字符串中的转义字符,因此它们很挑剔。

© www.soinside.com 2019 - 2024. All rights reserved.