SQL连接并聚合多个表

时间:2010-09-14 16:24:02

标签: sql oracle oracle10g

我有以下表格:

users
 - userid
 - real name
 - other stuff

roles
 - roleid
 - description
 - other stuff

functions
 - functionid
 - description

screens
 - screenid
 - description

用户可以拥有多个角色,由表格

控制
user_roles
 - userid
 - roleid

每个角色都可以编辑,查看或无法访问由表

控制的给定函数
role_functions
- roleid
- functionid
- status
如果角色对该函数具有编辑权限,则

status为'E';如果角色具有该函数的查看权限,则为'V',并且可以没有记录,或者具有'N'的记录如果角色没有该功能的权限,则为status。

最后,一个功能有多个屏幕,由表

控制
function_screens
 - functionid
 - screenid

我知道,这是一个令人困惑的混乱,但角色,功能和屏幕的要求来自不同的业务部门,所以我无法简化它。但是,我需要的是一个查询,我可以给QA部门和给定用户ID的其他人,他们可以列出所有屏幕,以及他们是否具有编辑,查看或无权访问该屏幕。如果该用户属于一个角色,该角色为包含屏幕的功能提供“E”权限,而另一个角色授予他们对包含同一屏幕的功能的“V”权限,则他们对该屏幕的权限为“E” ”。

现在我正在使用一堆带有Maps of Maps的Java代码完成所有这些查找,但我想知道在SQL脚本中是否有更简单的方法。

1 个答案:

答案 0 :(得分:4)

试试这个:

select s.screenid, s.description
, CASE MAX(CASE rf.status WHEN 'E' THEN 2 WHEN 'V' THEN 1 ELSE 0 END)
    WHEN 2 THEN 'E'
    WHEN 1 THEN 'V'
    ELSE 'N' END as status
from user_roles ur
join role_functions rf on rf.roleid = ur.roleid
join function_screens fs on fs.functionid = rf.functionid
join screens s on s.screenid = fs.screenid
where ur.userid = :theuser
group by s.screenid, s.description
order by s.screenid

2个嵌套的案例将E,V和N转换为2,1和0并返回,以便MAX可用于获得“最高”状态。