SQL em Oracle > DML > Percurso em árvore > Construir a árvore
Construir a árvore

O comando abaixo permite listar a tabela EMP em formato de árvore:

select level,LPAD(' ',4*(LEVEL-1)) || '* ' || ename "ENAME"
from emp
connect by prior empno = mgr
start with mgr is null;

LEVEL                  ENAME                  
---------------------- -----------------------
1                      * KING                 
2                          * JONES            
3                              * SCOTT         
4                                  * ADAMS     
3                              * FORD          
4                                  * SMITH     
2                          * BLAKE             
3                              * ALLEN         
3                              * WARD          
3                              * MARTIN        
3                              * TURNER        
3                              * JAMES         
2                          * CLARK             
3                              * MILLER        

14 rows selected

O comando abaixo lista a tabela EMP de forma hierarquica mostrando outras colunas:

select level, empno, ename, job, sal
from emp
connect by prior empno = mgr
start with mgr is null;

LEVEL                  EMPNO                  ENAME      JOB       SAL                   
---------------------- ---------------------- ---------- --------- ----------------------
1                      7839                   KING       PRESIDENT 5000                  
2                      7566                   JONES      MANAGER   2975                  
3                      7788                   SCOTT      ANALYST   3000                  
4                      7876                   ADAMS      CLERK     1100                  
3                      7902                   FORD       ANALYST   3000                  
4                      7369                   SMITH      CLERK     800                   
2                      7698                   BLAKE      MANAGER   2850                  
3                      7499                   ALLEN      SALESMAN  1600                  
3                      7521                   WARD       SALESMAN  1250                  
3                      7654                   MARTIN     SALESMAN  1250                  
3                      7844                   TURNER     SALESMAN  1500                  
3                      7900                   JAMES      CLERK     950                   
2                      7782                   CLARK      MANAGER   2450                  
3                      7934                   MILLER     CLERK     1300                  

14 rows selected

A árvore é percorrida aprofundando um ramo de cada vez. A tabela abaixo explica o comando:

COMANDO DESCRIÇÃO
SELECT Cláusula standard que que utiliza a pseudo-coluna LEVEL, pré definida, que determinará o nível do nó relativamente à raiz da árvore;
FROM Só pode efectuar FROM de uma tabela;
WHERE Restringe as linhas que são visitadas enquanto percorre a àrvore. Ver próximo tópico;
CONNECT BY Especifica as colunas em que existe relação entre linhas. É cláusula obrigatória para que haja percurso em árvore;
PRIOR Define a direcção em que é percorrida a àrvore:
* Se PRIOR aparece associado a EMPNO então, para cada valor de MGR, vão ser determinados os EMPNO que possuem esse valor de MGR. A árvore é percorrida de cima para baixo;
* Se PRIOR aparece associado a MGR então, para cada valor de EMPNO, são procurados os valores de MGR que possuem esse valor de EMPNO. A árvore é percorrida de baixo para cima;
START WITH Específica onde iniciar o percurso. No exemplo anterior começa no nó que não tem manager. É uma cláusula opcional;
ORDER BY Especifica uma sequência de ordenação, aparece sempre no fim e pode alterar a ordem hierarquica utilizada no output, induzindo em erro;

Se o comando anterior for executado retirando a cláusula START WITH, todos os nós são considerados raizes, formando a subárvore a partir deles. Se trocarmos a posição de PRIOR não obteremos árvore porque inverte a lógica pela qual foi construida a tabela.

No exemplo seguinte a utilização de ORDER BY não altera a estrutura da árvore:

select level, deptno, empno, ename, job, sal
from emp
connect by prior empno = mgr
start with mgr is null
order by deptno;

LEVEL                  DEPTNO                 EMPNO                  ENAME      JOB       SAL                    
---------------------- ---------------------- ---------------------- ---------- --------- ---------------------- 
2                      10                     7782                   CLARK      MANAGER   2450                   
3                      10                     7934                   MILLER     CLERK     1300                   
1                      10                     7839                   KING       PRESIDENT 5000                   
3                      20                     7902                   FORD       ANALYST   3000                   
4                      20                     7876                   ADAMS      CLERK     1100                   
3                      20                     7788                   SCOTT      ANALYST   3000                   
2                      20                     7566                   JONES      MANAGER   2975                   
4                      20                     7369                   SMITH      CLERK     800                    
3                      30                     7900                   JAMES      CLERK     950                    
3                      30                     7844                   TURNER     SALESMAN  1500                   
3                      30                     7654                   MARTIN     SALESMAN  1250                   
3                      30                     7521                   WARD       SALESMAN  1250                   
3                      30                     7499                   ALLEN      SALESMAN  1600                   
2                      30                     7698                   BLAKE      MANAGER   2850                   

14 rows selected

No exemplo seguinte a ordenação por EMPNO vai alterar toda a estrutura da árvore criada pela cláusula CONNECT BY. Ter em conta que o ORDER BY só é executado depois do CONNECT ter produzido o seu resultado:

select level, deptno, empno, ename, job, sal
from emp
connect by prior empno = mgr
start with mgr is null
order by empno;

LEVEL                  DEPTNO                 EMPNO                  ENAME      JOB       SAL                    
---------------------- ---------------------- ---------------------- ---------- --------- ---------------------- 
4                      20                     7369                   SMITH      CLERK     800                    
3                      30                     7499                   ALLEN      SALESMAN  1600                   
3                      30                     7521                   WARD       SALESMAN  1250                   
2                      20                     7566                   JONES      MANAGER   2975                   
3                      30                     7654                   MARTIN     SALESMAN  1250                   
2                      30                     7698                   BLAKE      MANAGER   2850                   
2                      10                     7782                   CLARK      MANAGER   2450                   
3                      20                     7788                   SCOTT      ANALYST   3000                   
1                      10                     7839                   KING       PRESIDENT 5000                   
3                      30                     7844                   TURNER     SALESMAN  1500                   
4                      20                     7876                   ADAMS      CLERK     1100                   
3                      30                     7900                   JAMES      CLERK     950                    
3                      20                     7902                   FORD       ANALYST   3000                   
3                      10                     7934                   MILLER     CLERK     1300                   

14 rows selected

bthome.gifTopo


Realizado por Turtle Learning ®. Última alteração em 2011-08-14