根据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'
注意:
- user_id 中可能存在空白。
- 组可以不包含任何内容,也可以包含任意数量的组或用户。
我已经通过使用 connect by
oracle 语句设法检索到完整的树,正确缩进和排序。
这不是我的问题。
我的问题是:
给定一个user_id一个查询,如何浏览到主组的树'All Users'
并作为结果输出从叶子到主组的完整路径?
示例 1:我 运行 查询 USER1,我想要以下输出:
All Users
- USER1
示例 2:我 运行 USER3 的相同查询,我想要以下输出:
All Users
- SUBGROUP1
-- SUBGROUP2
--- USER3
我希望有人能帮助我。
有关信息我 post 检索完整树的查询,供您查看 connect by
和 start 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;
我有一个 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' |
注意:
- user_id 中可能存在空白。
- 组可以不包含任何内容,也可以包含任意数量的组或用户。
我已经通过使用 connect by
oracle 语句设法检索到完整的树,正确缩进和排序。
这不是我的问题。
我的问题是:
给定一个user_id一个查询,如何浏览到主组的树'All Users' 并作为结果输出从叶子到主组的完整路径?
示例 1:我 运行 查询 USER1,我想要以下输出:
All Users
- USER1
示例 2:我 运行 USER3 的相同查询,我想要以下输出:
All Users
- SUBGROUP1
-- SUBGROUP2
--- USER3
我希望有人能帮助我。
有关信息我 post 检索完整树的查询,供您查看 connect by
和 start 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;