sql - 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 具有“通过先验连接”结构可以提供帮助,但我对数据库开发很陌生,不知道如何构建它。
我已经检查了这些页面,但我还不能想象一个解决方案:
解决方案
您可以使用:
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<>在这里摆弄
推荐阅读
- python - 仅打印最早的月份
- mongodb - 带有 typescript 类的 Meteor 和 Mongo 出现错误“类型 'typeof Mongo' 上不存在属性 'Collection'。” 编译时
- r - 使用变量作为 data.table 中的标题进行计算
- ruby-on-rails - 在 Ruby On Rails 中保存调查的答案
- excel - 如果大于 0,则返回单元格值
- angular6 - Angular6:ERROR 错误:mat-form-field 必须包含 MatFormFieldControl
- javascript - 运行 Cucumber 测试时会抛出错误并使用以下代码段实现未定义的实现
- html - HTML CSS
- 没有居中,当我滚动浏览时我的导航栏是“透明的”,为什么会这样?
- java - 我如何解决这个问题 -> 错误:无法创建 Java 虚拟机
- angular - Angular 5无法读取null的属性'scrollIntoView'