Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Oracle hierarchiczna klauzula startowa kwerendy od join

Twój r alias i rights tabela, do której się odwołuje, nie mieści się w zakresie tworzonego widoku wbudowanego. Musisz wygenerować hierarchię, co nadal możesz zrobić w widoku wbudowanym, a następnie dołączyć ją do rights tabeli poprzez jej folderid .

Możesz uzyskać hierarchię 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                         
...

To jest prawie to, co robiłeś, ale to znajduje wszystkich potomków z dowolnego punktu początkowego, a także przechwytuje punkt początkowy jako rootid . (Wrzuciłem path zbyt po prostu wizualizować hierarchię; wydaje się, że nie chcesz tego w wynikach).

Następnie możesz dołączyć do tabeli praw, gdzie folderid każdego użytkownika pasuje do dowolnego rootid . Spowoduje to wyświetlenie listy duplikatów (np. 685 może dostać się do 5538 bezpośrednio lub przez 5534), więc możesz użyć distinct aby je wyeliminować:

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;

Które z Twoimi danymi uzyskają 16 różnych kombinacji:

    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

Możesz też użyć rekurencyjnego faktoringu podzapytań zamiast zapytania hierarchicznego:

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;

Element zakotwiczenia to proste sprzężenie między dwiema tabelami w celu uzyskania uprawnień najwyższego poziomu. Rekursywny element członkowski następnie szuka wszelkich uprawnień podrzędnych już znalezionych. Ten sam wynik, nieco inne podejście.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak napisać zapytanie SQL, które łączy wiele wierszy z tabeli wejściowej w jeden wiersz w tabeli wyjściowej?

  2. cx_Oracle:Jak iterować zestaw wyników?

  3. Dlaczego wiele tabel ORACLE domyślnie 12c?

  4. Jak należy interpretować Select Distinct aliasRefForMe.field1 From [email protected] aliasRefForMe

  5. SEC_CASE_SENSITIVE_LOGON Przestarzałe w 12c