CAPITOLUL 11
TRAVERSAREA ARBORILOR
Acest capitol detaliaza recuperarea datelor bazate pe o relatie
ierarhi- ca naturala intre doua linii ale tabelei.
Traversarea arborilor
Tabela EMP are o structura arborescenta reprezentand linia de raport a
conducerii.
Parcurgerea arborelui
KING EMPNO=7839
|
---------------------------------
| | | MGR=7839
CLARK JONES BLAKE
| | |
| ------ -------------------------
| | | | | | | |
MILLER SCOTT FORD ALLEN WARD MARTIN TURNER JAMES
| |
| |
ADAMS SMITH
O baza de date relationala nu contine inregistrarile intr-un mod ierarhic.
Oricum, unde exista o legatura ierarhica intre liniile unei singure tabele,
este un proces numit 'parcurgere de arbore' care face posibil ca ierarhia sa
fie construita.Ierarhia poate fi creata privind la legatura dintre valorile
echivalente in coloanele EMPNO si MGR(Aceasta legatura a fost deja exploa-
tata cu join-ul unei tabele cu ea insesi). Numarul MGR al unui angajat este
EMNO-ul sefului sau.
Cand este realizata o parcurgere de arbore, nu va asteptati sa vedeti
rezultatul cererii asemanator cu figura afisata mai sus. Numerele LEVEL (de
nivel) sunt stabilite cand apare parcurgerea arborelui si reprezinta cat de
indepartate sunt nodurile (liniile) de radacina (nodul de start).
Pentru a construi un arbore de traversare din tabela EMP, introduceti:
SELECT LEVEL, DEPTNO, ENAME, JOB, SAL
FROM EMP
CONNECT BY PRIOR EMPNO = MGR
START WITH MGR IS NULL;
Comanda Descriere
------- ---------
SELECT Clauza SELECT standard, cu pseudo-coloana LEVEL
care afiseaza cat de departe este fiecare nod
de nodul de start.
FROM Puteti sa SELECT FROM o singura tabela.
WHERE Limiteaza liniile care sunt vizitate in timpul
parcurgerii.
CONNECT BY Specifica coloanele unde exista legatura intre
linii. Aceasta clauza este ceruta pentru o
parcurgere de arbore.
PRIOR Stabileste directia in care este parcurs arbo-
rele. Daca PRIOR apare inainte de MGR, atunci
valorile in coloana MGR sunt vizitate primele,
apoi sunt gasite valorile echivalente din
EMPNO, care este in susul arborelui. Daca PRIOR
apare inainte de EMPNO atunci arborele este in
jos.
START WITH Specifica unde sa inceapa arborele. Nu poate
incepe la un nivel(LEVEL). Aceasta clauza
este optionala chiar cand este ceruta o par-
curgere de arbore.
ORDER BY Apare la sfarsit de obicei.
In exemplul de mai sus, structura ierarhica a organizatiei este reflectata in
parcurgerea arborelui. Structura raportata conducere/angajati poate fi
identificata cu claritate.
Puteti folosi clauza ORDER BY pentru a sorta liniile returnate.Urmatoarea
comanda este perfect legitima:
SELECT LEVEL, DEPTNO, ENAME, JOB, SAL
FROM EMP
CONNECT BY PRIOR EMPNO = MGR
START WITH MGR IS NULL
ORDER BY DEPTNO;
Oricum, este recomandat sa nu folositi clauza ORDER BY la parcurgerea arbo-
relui pentru ca ordonarea implicita a arborelui poate fi distrusa. In
exemplul de mai jos, ordinea in care liniile lui SCOTT, ADAMS, FORD si SMITH
sunt afisate s-a schimbat, si ADAMS pare sa se raporteze la FORD cand SCOTT
este de fapt seful sau. Iesirea (rezultatul) nu reflecta ierarhia
"adevarata".
SELECT LEVEL, DEPTNO, ENAME, JOB, SAL
FROM EMP
CONNECT BY PRIOR EMPNO = MGR START WITH MGR IS NULL
ORDER BY DEPTNO;
Parcurgerea arborilor
SELECT ENAME, LEVEL, JOB
FROM EMP
CONNECT BY PRIOR EMPNO = MGR
START WITH MGR IS NULL
EXCLUDERI :
WHERE ENAME!='SCOTT'
JONES
|
----------------------------
| |
SCOTT (se sterge) FORD
| |
ADAMS SMITH
CONNECT BY PRIOR EMPNO=MGR
AND ENAME!='SCOTT'
JONES
|
----------------------------
| |
SCOTT (se sterge) FORD
| |
ADAMS (se sterge) SMITH
TERMINOLOGIE
Sunt cativa termeni mai degraba neobisnuiti cand parcurgeti arborele. Nu este
nevoie sa-i amintim pe toti, decat pentru informatie:
NODE acelasi lucru cu o linie
ROOT un nod care nu este in proprietatea nimanui
PARENT un nod care are alte noduri la un nivel inferior
CHILD un nod care are un PARENT
TERMINAL NODE sau LEAF un nod fara fii
BRANCH un nod cu fii si nepoti
Chirurgia arborelui
Clauzele WHERE si CONNECT pot fi folosite pentru a curata arborele, care
controleaza ce noduri sunt afisate. Daca clauza WHERE este folosita pentru a
elimina un nod, atunci doar acel nod este eliminat. Daca restrictia apare in
clauza CONNECT BY atunci intreaga ramura este eliminata.
In exemplul urmator, numai linia SCOTT este eliminata, fiii sai sunt inca
procesati.
BREAK ON DEPTNO SKIP 1
SELECT LEVEL, DEPTNO, ENAME, JOB, SAL
FROM EMP WHERE ENAME != 'SCOTT'
CONNECT BY PRIOR EMPNO = MGR
START WITH MGR IS NULL;
In exemplul de mai jos, intreaga ramura SCOTT a fost eliminata:
SELECT LEVEL, DEPTNO, ENAME, JOB, SAL
FROM EMP
CONNECT BY PRIOR EMPNO = MGR AND ENAME != 'SCOTT'
START WITH MGR IS NULL;
Notati ca de aceasta data ambele linii, parinte (SCOTT) si fiu (ADAMS), au
fost excluse.
Alte utilizari ale parcurgerii arborilor
Organizarea tabelelor nu este singura aplicatie a unei cereri structura- te
pe arbore. Clauza CONNECT BY poate fi folosita de asemenea in:
* nota de plata a aplicatiilor materiale, sa produca explozii sau
implozii partilor indentate.
* bilantul aplicatiilor pentru scopuri de consolidare.
BogSoft 1999