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 |
Realizado por Turtle Learning ®. Última alteração em 2011-08-14