根据Oracle中的叶子从层次树中提取子树

Extract a sub-tree from a hierarchy tree based on a leaf in Oracle

我有一个 table users 表示像这样的分层树:

Column Type Comment
user_id integer sequence
user_type integer 1 for group of users 2 for normal user
group_id integer Reference to a user in the same table with user_type = 1
user_name varchar(xxx)

group_id 列引用另一个 user_id,因此组和用户存储在同一个 table。

大师group_id为0.

像这样:

user_id user_type group_id user_name
0 1 null 'All users'
5 2 0 'USER1'
6 2 0 'USER2'
11 1 0 'SUBGROUP1'
12 1 11 'SUBGROUP2'
13 2 12 'USER3'
20 1 0 'SUBGROUP3'
21 2 20 'USER4'

注意:

我已经通过使用 connect by oracle 语句设法检索到完整的树,正确缩进和排序。

这不是我的问题。

我的问题是:

给定一个user_id一个查询,如何浏览到主组的树'All Users' 并作为结果输出从叶子到主组的完整路径?

示例 1:我 运行 查询 USER1,我想要以下输出:

All Users
- USER1

示例 2:我 运行 USER3 的相同查询,我想要以下输出:

All Users
- SUBGROUP1
-- SUBGROUP2
--- USER3

我希望有人能帮助我。

有关信息我 post 检索完整树的查询,供您查看 connect bystart with 的用法。 我确定此查询接近我想要的查询,但我的尝试从未产生我想要的结果。

select 
  lpad('-', (level - 1) * 2, ' ') || u.user_name as padded_name, 
  u.userid, 
  u.user_group, 
  u.user_type,
  level
from users u
connect by prior u.user_id = u.group_id
start with u.user_id = 0
order siblings by upper(u.user_name);

你可以用connect by向相反的方向走。那么 level 当然也会相反。因此,为了以正确的顺序和缩进获得结果,根据这些结果链接另一个查询,该查询将使用 row_number() 来确定缩进:

with base as (
  select 
    u.user_name,
    u.user_id, 
    u.group_id, 
    u.user_type,
    level as lvl
  from users u
  connect by prior u.group_id = u.user_id
  start with u.user_id = 13
)
select 
  lpad('-', (row_number() over (order by lvl desc) - 1) * 2, ' ') || base.user_name
    as padded_name,
  user_id,
  group_id,
  user_type
from base
order by lvl desc;