Vaše r
alias a rights
tabulka, na kterou odkazuje, nejsou v rozsahu pro vložený pohled, který vytváříte. Musíte vygenerovat hierarchii, což můžete stále provádět v inline zobrazení, a poté ji připojit k rights
tabulky prostřednictvím folderid
.
Hierarchii můžete získat z:
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
...
Což je v podstatě to, co jste dělali, ale toto najde všechny potomky z libovolného počátečního bodu a také zachytí počáteční bod jako rootid
. (Vložil jsem path
příliš jen pro vizualizaci hierarchie; zdá se, že to ve výsledcích nechcete).
Poté to můžete připojit k tabulce vašich práv, kde je folderid
každého uživatele odpovídá libovolnému rootid
. Tím se zobrazí duplikáty (např. číslo 685 se může dostat na číslo 5538 přímo nebo přes číslo 5534), takže můžete použít distinct
k jejich odstranění:
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;
Což s vašimi daty získá 16 různých kombinací:
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
Můžete také použít rekurzivní faktoring poddotazů místo hierarchického dotazu:
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;
Kotevní člen je jednoduché spojení mezi dvěma tabulkami pro získání oprávnění nejvyšší úrovně. Rekurzivní člen pak hledá jakákoli podřízená oprávnění všech již nalezených. Stejný výsledek, trochu jiný přístup.