Sunteți pe pagina 1din 9

BAZE DE DATE – SEMINAR 8

___________________________________________________________________________

PARCURGEREA STRUCTURILOR IERARHICE

1. Moduri de parcurgere a structurilor arborescente:

 TOP-DOWN – se construieste setul de inregistrari copil incepand cu inregistrarea


radacina
 BOTTOM-UP – se construieste setul de inregistrari parinte pana la inregistrarea
radacina pentru un anumit nivel din ierarhie
 DIRECT PE UN ANUMIT NIVEL – se construieste setul de inregistrari incepand
cu un anumit nivel din ierarhi

2. Comenzi utilizate
Daca o tabela contine date arborescente, se pot selecta tuplurile intr-o ordine ierarhica prin
utilizarea unor clauze suplimentare in comanda SELECT:
SELECT [DISTINCT]
[LEVEL] ,
[SYS_CONNECT_BY_PATH(camp, '/')],
[CONNECT_BY_ROOT],
[CONNECT_BY_ISCYCLE],
[CONNECT_BY_ISLEAF], lista_coloane
FROM nume_tabela
WHERE conditii
CONNECT BY [NOCYCLE] [PRIOR] coloana_inregistrarii_copil=[PRIOR]
coloana_inregistrarii_parinte
START WITH coloana_radacina;

unde:
START WITH - specifica inregistrarile radacina pentru ierarhiile construite. Daca se omite
Oracle foloseste toate inregistrarile din tabela ca inregistrari radacina.
CONNECT BY - specifica relatia intre coloana inregistrarii parinte si coloana inregistrarii
copil ale ierarhiei.
PRIOR – se refera la inregistrarea parcursa anterior. Locul operatorului in conditia de legatura
parinte-copil determina modul de parcurgere al arborelui (top-down sau bottom-up).
LEVEL – se utilizeaza pentru a afisa nivelul inregistrarii parcurse.

Observatii:
1. Nu se recomanda utilizarea clauzei GROUP BY deoarece se pot produce schimbari in setul
returnat de cererea ierarhica.
2. O cerere ierarhica nu se foloseste intr-o jonctiune si nu poate selecta date dintr-o tabela
virtuala.

3. Procesarea interogarilor:

Pas 1: Oracle selecteaza inregistrarile radacina ale ierarhiei ce satisfac conditia din clauza
START WITH.
Pas 2: Oracle selecteaza inregistrarile copil pentru fiecare inregistrare radacina. Fiecare
inregistrare copil trebuie sa satisfaca conditia din clauza CONNECT BY.

1
BAZE DE DATE – SEMINAR 8
___________________________________________________________________________

Pas 3: Oracle selecteaza generatii succesive de inregistrari copil evaluand clauza CONNECT
BY.
Pas 4: Daca exista o conditia in clauza WHERE se elimina toate acele inregistrari care nu
satisfac conditia.
Pas 5: Se construieste setul de inregistrari care satisfac conditia de parcurgere a ierarhiei.

Figura 1: Interogari ierarhice


Exemple:
Structura partiala a tabelei utilizate ca exemplu (tabela angajati din schema HR)

ID_ANGAJAT PRENUME NUME SALARIUL COMISION ID_MANAGER ID_DEPARTAMENT

Observatie: Inregistrarea radacina contine angajatul cu numele Steven King cu


ID_ANGAJAT = 100 si ID_MANAGER = NULL.

I. Parcurgerea arborelui TOP-BOTTOM:


1. Sa se afiseze angajatii si nivelul ierarhic al acestora pornind de la angajatul cu id-ul 100 (sa
se ordoneze in functie de nivelul ierahic).
SELECT id_angajat, nume, id_manager, LEVEL FROM angajati
CONNECT BY PRIOR id_angajat= id_manager
START WITH id_angajat = 100;

2
BAZE DE DATE – SEMINAR 8
___________________________________________________________________________

SELECT id_angajat, nume, id_manager, LEVEL FROM angajati


CONNECT BY PRIOR id_angajat= id_manager
START WITH id_angajat = 100
ORDER BY LEVEL;

2. Afisati angajatii companiei subordonati inregistrarii radacina sub forma de organigrama.


SELECT LEVEL, LPAD(' ', LEVEL)|| nume FROM angajati
CONNECT BY PRIOR id_angajat = id_manager
START WITH id_angajat= 100;

3
BAZE DE DATE – SEMINAR 8
___________________________________________________________________________

SELECT LEVEL, LPAD(' ', LEVEL)|| nume FROM angajati


CONNECT BY PRIOR id_angajat = id_manager
START WITH id_angajat= 100
ORDER BY LEVEL;

3. Afisati angajatii companiei subordonati inregistrarii radacina specificand numarul de


superiori si toti superiorii sai, id-urile (se utilizeaza clauzele: SYS_CONNECT_BY_PATH,
LEVEL-1):

4
BAZE DE DATE – SEMINAR 8
___________________________________________________________________________

SELECT id_angajat, nume,


LEVEL-1 Numar_Superiori, SYS_CONNECT_BY_PATH(id_angajat, '/') ID_Superiori
FROM angajati
START WITH id_angajat= 100
CONNECT BY PRIOR id_angajat = id_manager;

Interogari ierarhice conditionate (clauza WHERE):

4. Sa se selecteze angajatii si gradul de subordonare numai pentru cei din departamentele 20 si


50:

SELECT id_angajat, nume, id_manager, level FROM angajati


WHERE id_departament IN (20, 50)
CONNECT BY PRIOR id_angajat = id_manager
START WITH id_angajat = 100;

II. Parcurgerea arborelui BOTTOM UP

5. Sa se afiseze superiorii angajatilor aflati pe ultimul nivel de subordonare:


SELECT nume, LEVEL-1 Numar_Superiori, SYS_CONNECT_BY_PATH(nume, '/')
Nume_Superiori
FROM angajati
START WITH id_angajat = 100
CONNECT BY PRIOR id_angajat = id_manager
ORDER BY LEVEL desc;

6. Sa se afiseze toti superiorii lui ‘Faviet’:


SELECT id_angajat, nume, id_manager, LEVEL FROM angajati
CONNECT BY id_angajat = PRIOR id_manager
START WITH nume= 'Faviet';

III. Parcurgerea arborelui incepind cu un anumit nivel

7. Sa se afiseze toti subordonatii lui 'De Haan':


SELECT id_angajat, nume, id_manager, LEVEL FROM angajati
CONNECT BY PRIOR id_angajat = id_manager
START WITH nume= 'De Haan'
ORDER BY LEVEL;

5
BAZE DE DATE – SEMINAR 8
___________________________________________________________________________

8. Sa se afiseze toti superiorii lui De Haan:


SELECT id_angajat, nume, id_manager, LEVEL FROM angajati
CONNECT BY id_angajat = PRIOR id_manager
START WITH nume= 'De Haan'
ORDER BY LEVEL;

9. Sa se afiseze toti subordonatii lui 'Kochhar' si care sunt in acelasi departament cu 'Chen':
SELECT id_angajat, nume, id_manager, id_departament, LEVEL FROM angajati
WHERE id_departament = (SELECT id_departament FROM angajati WHERE nume='Chen')
CONNECT BY PRIOR id_angajat = id_manager
START WITH nume = 'Kochhar'
ORDER BY LEVEL;

10. Sa se selecteze toti angajatii din departamentul 100 si subordonatii acestora:


SELECT id_angajat, nume, id_manager, id_departament, LEVEL FROM angajati
CONNECT BY PRIOR id_angajat= id_manager
START WITH id_departament=100
ORDER BY LEVEL;

6
BAZE DE DATE – SEMINAR 8
___________________________________________________________________________

11. Sa se afiseze toti subordonatii lui 'Kochhar' fara cei din departamentul 100.
SELECT id_angajat, nume, id_manager, id_departament, LEVEL FROM angajati
WHERE id_departament != 100
CONNECT BY PRIOR id_angajat = id_manager
START WITH nume= 'Kochhar'
ORDER BY LEVEL;

12. Sa se afiseze toti subordonatii lui 'Kochhar' si mai putin cei din departamentele 100 si 110.
SELECT id_angajat, nume, id_manager, id_departament, LEVEL FROM angajati
WHERE id_departament NOT IN (100,110)
CONNECT BY PRIOR id_angajat = id_manager
START WITH nume= 'Kochhar'
ORDER BY LEVEL;

13. Sa se afiseze toti subordonatii lui 'Kochhar' si cei ai lui ‘De Haan’:
SELECT id_angajat, nume, id_manager, LEVEL FROM angajati
CONNECT BY PRIOR id_angajat = id_manager
START WITH nume = 'Kochhar' OR nume= 'De Haan'
ORDER BY LEVEL;

7
BAZE DE DATE – SEMINAR 8
___________________________________________________________________________

14. Sa se afiseze toti subordonatii de pe nivelul 3:


SELECT id_angajat, nume, id_manager, LEVEL FROM angajati
WHERE LEVEL=3
CONNECT BY PRIOR id_angajat = id_manager
ORDER BY LEVEL;

15. Sa se afiseze toti subordonatii incepand cu nivelul 3:


SELECT id_angajat, nume, id_manager, LEVEL FROM angajati
WHERE LEVEL>=3
CONNECT BY PRIOR id_angajat = id_manager

8
BAZE DE DATE – SEMINAR 8
___________________________________________________________________________

ORDER BY LEVEL;

16. Sa se afiseze numarul total de angajati subordonati lui 'Steven King' grupati pe
departamente:
SELECT id_departament, count(*) Total_Angajati from angajati
CONNECT BY PRIOR id_angajat = id_manager
START WITH id_angajat = 100
GROUP BY id_departament;

17. Sa se selecteze toti subordonatii angajatilor cu functia CLERK.


SELECT id_angajat, nume, id_manager, id_functie FROM angajati
CONNECT BY PRIOR id_angajat = id_manager
START WITH id_functie LIKE '%CLERK%'
ORDER BY LEVEL;

S-ar putea să vă placă și