Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

klausa awal kueri hierarkis oracle dari join

r . Anda alias dan rights tabel yang dirujuk tidak dalam cakupan tampilan sebaris yang Anda buat. Anda perlu membuat hierarki, yang masih dapat Anda lakukan dalam tampilan sebaris, lalu menggabungkannya ke rights tabel melalui folderid .

Anda bisa mendapatkan hierarki dari:

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                         
...

Cukup banyak yang Anda lakukan, tetapi ini menemukan semua keturunan dari titik awal mana pun, dan juga menangkap titik awal sebagai rootid . (Saya telah memasukkan path terlalu hanya untuk memvisualisasikan hierarki; Anda tampaknya tidak menginginkan itu dalam hasil).

Anda kemudian dapat menggabungkannya ke tabel hak Anda, di mana folderid setiap pengguna cocok dengan rootid . Itu akan mencantumkan duplikat (mis. 685 bisa langsung ke 5538 atau melalui 5534), jadi Anda bisa menggunakan distinct untuk menghilangkannya:

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;

Yang dengan data Anda mendapatkan 16 kombinasi berbeda:

    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

Anda juga dapat menggunakan pemfaktoran subkueri rekursif alih-alih kueri hierarkis:

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;

Anggota jangkar adalah gabungan sederhana antara dua tabel untuk mendapatkan izin tingkat atas. Anggota rekursif kemudian mencari izin anak apa pun yang sudah ditemukan. Hasil yang sama, pendekatan yang sedikit berbeda.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara menggunakan AD Terdistribusi untuk mengurangi waktu patching di Oracle EBS

  2. Bagaimana menjalankan file batch dari dalam prosedur PL/SQL

  3. Bagaimana cara menulis kueri penyisipan Oracle berparameter?

  4. oracle mengonversi waktu zaman unix menjadi tanggal

  5. Pilih ke tabel sementara di Oracle