sql >> Databáze >  >> RDS >> Oracle

věštec hierarchický dotaz start clause from join

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.



  1. psycopg2.ProgrammingError:chyba syntaxe na nebo blízko chyby stdin při pokusu o copy_from redshift

  2. Pomocí Dockeru, co spustilo PANIC:nemohl najít platný záznam kontrolního bodu

  3. ORA-00906:chybějící levá závorka

  4. Získání výsledků Mysql bez znalosti názvu sloupce