Oracle SQL "connect by prior" 获取继承权限
Oracle SQL "connect by prior" for getting inherited permissions
我有这样的数据:
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 具有可以提供帮助的“先验连接”结构,但我对数据库开发还很陌生,不知道如何构建它。
我已经检查了这些页面,但我还不能想出解决方案:
- SQL connect by for many rows
您可以使用:
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
FILE_NAME
USER_GROUP_ID
GROUP_PERMISSION
FILE_PARENT
1
abc
devs
read
1
abc
devs
write
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
db<>fiddle here
我有这样的数据:
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 具有可以提供帮助的“先验连接”结构,但我对数据库开发还很陌生,不知道如何构建它。
我已经检查了这些页面,但我还不能想出解决方案:
- SQL connect by for many rows
您可以使用:
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 FILE_NAME USER_GROUP_ID GROUP_PERMISSION FILE_PARENT 1 abc devs read 1 abc devs write 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
db<>fiddle here