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: