Documente Academic
Documente Profesional
Documente Cultură
Seminar 8 Structuri Ierarhice - REZOLVARI
Seminar 8 Structuri Ierarhice - REZOLVARI
___________________________________________________________________________
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.
2
BAZE DE DATE – SEMINAR 8
___________________________________________________________________________
3
BAZE DE DATE – SEMINAR 8
___________________________________________________________________________
4
BAZE DE DATE – SEMINAR 8
___________________________________________________________________________
5
BAZE DE DATE – SEMINAR 8
___________________________________________________________________________
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;
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
___________________________________________________________________________
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;