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.