Oracle SQL中如何将含Null值的表扩展为视图替换为多记录?
可以实现,具体SQL写法如下
核心思路是拆分两种场景处理:
- 对于用户权限表中
role字段非空的记录,直接保留原数据 - 对于
role字段为NULL的记录,关联组角色表获取该用户所属组的全部角色
假设用户权限表名为user_permissions,组角色表名为group_roles,创建视图的SQL语句如下:
CREATE OR REPLACE VIEW user_full_permissions AS -- 保留role非空的原始记录 SELECT "user", "group", role FROM user_permissions WHERE role IS NOT NULL UNION ALL -- 处理role为空的情况,关联组角色表获取全量角色 SELECT up."user", up."group", gr.role FROM user_permissions up JOIN group_roles gr ON up."group" = gr."group" WHERE up.role IS NULL;
验证结果
执行上述视图创建语句后,查询user_full_permissions就能得到你需要的结果:
| user | group | role |
|---|---|---|
| example1 | ABC | 100 |
| example1 | XYZ | 200 |
| example2 | ABC | 100 |
| example2 | ABC | 150 |
| example2 | ABC | 200 |
| example2 | ABC | 250 |
| example2 | ABC | 300 |
补充说明
- 因为
user和group是Oracle的关键字,所以用双引号包裹字段名避免语法错误,如果你实际表中的字段名不是这两个,可以去掉双引号 - 用
UNION ALL而非UNION,因为两种场景的记录不会重复,UNION ALL无需去重,执行效率更高
内容的提问来源于stack exchange,提问作者Nova
相关产品推荐
相关产品推荐

