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: