我正在尝试找到一种方法来合并包含用户资源访问权限的行。我执行此查询时会传递此用户拥有的组列表,并且可能一个组允许访问资源,而另一个组拒绝。
我有这样的东西:
RESOURCE | ACCESS (F force allow, D deny, A allow) res1 | F res1 | D res2 | A res3 | A res3 | D
从这些行中,我想返回以下内容:
RESOURCE | ACCESS res1 | F res2 | A
如果我有强制允许,无论如何它都会允许。如果它有一个允许 + 一个拒绝,则拒绝获胜。所以最后我只需要知道什么是允许的。
你们看到它是如何制造的吗?
假设您的表是 RES,列是RESOURCE_,ACCESS_。然后,可以使用此查询获取允许的资源。
select resource_ , decode(appl_access,3,'F',1,'A') from (
select r1.resource_, max (decode(r1.access_,'F',3,'D',2,'A',1,0))
appl_access from res r1
group by r1.resource_)
where appl_access in (1,3);
这是SQL Fiddle http://sqlfiddle.com/#!4/295c9d/1
函数
row_number() 的可能性之一:
select res, acc
from (
select res, acc,
row_number() over (partition by res
order by case acc when 'F' then 1
when 'D' then 2
when 'A' then 3
end) rn
from test )
where rn=1 and acc<>'D'
SQLFiddle