Seu
r
alias e os rights
tabela a que se refere não está no escopo da exibição em linha que você está criando. Você precisa gerar a hierarquia, o que ainda pode ser feito em uma visualização em linha, e depois juntá-la aos rights
tabela por meio de seu folderid
. Você pode obter a hierarquia de:
select connect_by_root(folderid) as rootid, folderid,
sys_connect_by_path(folderid, '/') as path
from folders
connect by parentfolderid = prior folderid
order by rootid, path;
ROOTID FOLDERID PATH
---------- ---------- ------------------------------
5162 5162 /5162
5162 28568 /5162/28568
5162 6343 /5162/6343
5534 5534 /5534
5534 41578 /5534/41578
5534 113867 /5534/41578/113867
5534 127030 /5534/41578/127030
5534 5162 /5534/5162
5534 28568 /5534/5162/28568
5534 6343 /5534/5162/6343
5534 5538 /5534/5538
5538 5538 /5538
...
Que é praticamente o que você estava fazendo, mas isso encontra todos os descendentes de qualquer ponto de partida e também captura o ponto de partida como
rootid
. (Eu joguei em path
muito apenas para visualizar a hierarquia; você não parece querer isso nos resultados). Você pode então juntar isso à sua tabela de direitos, onde o
folderid
de cada usuário corresponde a qualquer rootid
. Isso listará duplicatas (por exemplo, 685 pode chegar a 5538 diretamente ou via 5534), para que você possa usar distinct
para eliminá-los:select distinct r.userid, f.folderid
from rights r
join (
select connect_by_root(folderid) as rootid, folderid
from folders
connect by prior folderid = parentfolderid
) f
on f.rootid = r.folderid
order by r.userid, f.folderid;
Que com seus dados obtém 16 combinações distintas:
USERID FOLDERID
---------- ----------
685 5162
685 5534
685 5538
685 6343
685 28568
685 41578
685 113867
685 127030
686 5162
686 6343
686 28568
686 41578
686 113867
686 127030
725 113867
725 127030
Você também pode usar a fatoração de subconsulta recursiva em vez de uma consulta hierárquica:
with rcte (userid, folderid) as (
select r.userid, f.folderid
from rights r
join folders f on f.folderid = r.folderid
union all
select rcte.userid, f.folderid
from rcte
join folders f on f.parentfolderid = rcte.folderid
)
select distinct userid, folderid
from rcte
order by userid, folderid;
O membro âncora é uma junção simples entre as duas tabelas para obter as permissões de nível superior. O membro recursivo então procura por quaisquer permissões filhas de qualquer uma já encontrada. Mesmo resultado, abordagem ligeiramente diferente.