Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

cláusula de início de consulta hierárquica oracle da junção


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.