首页 > 解决方案 > Oracle SQL“先连接”用于获取继承权限

问题描述

我有如下数据:

file_id  |  file_name | user_group_id | group_permission | file_parent
1           abc              devs          read               NULL
1           abc              devs          write              NULL
2           def              NULL          NULL                1
3           jkl              NULL          NULL                2 
3           ghi              end_u         read                2

它在一种层次结构树中,其中文件附加了用户组和权限,我拥有的数据并不总是附加用户组和权限,如果是这种情况,那么他们应该继承用户组和权限他们的父母(有时它可能是超级父母,即父母的父母)。我想构建如下所示的输出,但我不能使用递归

file_id  |  file_name | user_group_id | group_permission | file_parent
    1           abc              devs          read               NULL
    1           abc              devs          write              NULL
    2           def              devs          read                1
    2           def              devs          write               1
    3           jkl              devs          read                2
    3           jkl              devs          write               2
    4           ghi              end_u         read                2

我试图寻找一个解决方案,似乎 Oracle 具有“通过先验连接”结构可以提供帮助,但我对数据库开发很陌生,不知道如何构建它。

我已经检查了这些页面,但我还不能想象一个解决方案:

标签: sqloracleoracle11ghierarchical

解决方案


您可以使用:

SELECT file_id,
       file_name,
       CONNECT_BY_ROOT(user_group_id) AS user_group_id,
       CONNECT_BY_ROOT(group_permission) AS group_permission,
       file_parent
FROM   table_name
START WITH
       user_group_id    IS NOT NULL
AND    group_permission IS NOT NULL
CONNECT BY
       PRIOR file_id    = file_parent
AND    user_group_id    IS NULL
AND    group_permission IS NULL
ORDER BY
       file_id,
       file_name,
       group_permission

其中,对于您的示例数据:

CREATE TABLE table_name ( file_id, file_name, user_group_id, group_permission, file_parent ) AS
SELECT 1, 'abc', 'devs',  'read',  NULL FROM DUAL UNION ALL
SELECT 1, 'abc', 'devs',  'write', NULL FROM DUAL UNION ALL
SELECT 2, 'def', NULL,    NULL,    1 FROM DUAL UNION ALL
SELECT 3, 'jkl', NULL,    NULL,    2 FROM DUAL UNION ALL
SELECT 4, 'ghi', 'end_u', 'read',  2 FROM DUAL;

输出:

FILE_ID 文件名 USER_GROUP_ID GROUP_PERMISSION FILE_PARENT
1 美国广播公司 开发者
1 美国广播公司 开发者
2 定义 开发者 1
2 定义 开发者 1
3 jkl 开发者 2
3 jkl 开发者 2
4 end_u 2

db<>在这里摆弄


推荐阅读