具有多个父级的 Oracle 分层查询

Posted

技术标签:

【中文标题】具有多个父级的 Oracle 分层查询【英文标题】:Oracle Hierarchical query with multiple parents 【发布时间】:2022-01-09 00:22:03 【问题描述】:

我需要帮助来构建以以下方式返回数据的查询。我认为分层查询可能会有所帮助。但我不确定如何在我的情况下使用它。

例如, 我有以下数据

Grantee  Role
-------  ------
User_1   Role_4
Role_4   Role_1
Role_4   Role_2
Role_4   Role_3 
User_2   Role_5
User_2   Role_6

我需要返回用户已直接或间接授予的所有角色。我知道如何查询单个用户的所有角色

SELECT DISTINCT GRANTED_ROLE FROM DBA_ROLE_PRIVS
  START WITH GRANTEE=UPPER('&&USERNAME')
  CONNECT BY PRIOR GRANTED_ROLE=GRANTEE

用户User_1的查询结果是

ROLE_1
ROLE_2
ROLE_3
ROLE_4

但我不知道如何为多个用户返回所有角色。 例如,我希望通过以下方式获得结果集

Grantee  Role
-------  ------
User_1   Role_4
User_1   Role_1     
User_1   Role_2     
User_1   Role_3     
User_2   Role_5
User_2   Role_6

【问题讨论】:

【参考方案1】:

在我看来,你必须有一些东西开始 - 因此我的子查询(见第 11 行);那么,这可能是一种选择:

SQL> with test (grantee, role) as
  2    (select 'user_1', 'role_4' from dual union all
  3     select 'role_4', 'role_1' from dual union all
  4     select 'role_4', 'role_2' from dual union all
  5     select 'role_4', 'role_3' from dual union all
  6     select 'user_2', 'role_5' from dual union all
  7     select 'user_2', 'role_6' from dual
  8    )
  9  select distinct regexp_substr(sys_connect_by_path(grantee, '-'), '\w+', 1, 1) grantee, role
 10  from test
 11  start with grantee in (select grantee from test where grantee like 'user%')
 12  connect by prior role = grantee
 13  order by grantee, role;

GRANTEE    ROLE
---------- ------
user_1     role_1
user_1     role_2
user_1     role_3
user_1     role_4
user_2     role_5
user_2     role_6

6 rows selected.

SQL>

【讨论】:

非常感谢!!有用。你拯救了我的一天。 不错的答案,但为什么是子查询而不仅仅是start with grantee like 'user%'

以上是关于具有多个父级的 Oracle 分层查询的主要内容,如果未能解决你的问题,请参考以下文章

具有自定义父级的 Spring Boot 父级 pom

如何找到具有特定父级的元素?

如何在 Oracle 11g 中查找给定父级的所有子 ID

从混合层级中查找多个子级的第一个共同父级

具有绝对父级的 div 的 jQuery 动画宽度

使用 CSS 显示和隐藏具有不同父级的 div 元素