Considere a tabela abaixo:
select * from
(select 5533 registro, 'João' nome, 5000 registro_pai from dual
union
select 5000 registro, 'Lima' nome, NULL registro_pai from dual
union
select 4444 registro, 'Zé' nome, 5533 registro_pai from dual
union
select 3358 registro, 'Souza' nome, 4444 registro_pai from dual) tabela;
|
REGISTRO
|
NOME
|
REGISTRO_PAI
|
|
3358
|
Souza
|
4444
|
|
4444
|
Zé
|
5533
|
|
5000
|
Lima
|
|
|
5533
|
João
|
5000
|
A consulta a seguir monta a árvore hierarquica para cada um dos registros em ordem crescente do menor filho para o maior pai:
select * from
(select 5533 registro, 'João' nome, 5000 registro_pai from dual
union
select 5000 registro, 'Lima' nome, NULL registro_pai from dual
union
select 4444 registro, 'Zé' nome, 5533 registro_pai from dual
union
select 3358 registro, 'Souza' nome, 4444 registro_pai from dual) tabela
connect by prior registro_pai = registro;
Resultado:
|
REGISTRO
|
NOME
|
REGISTRO_PAI
|
|
3358
|
Souza
|
4444
|
|
4444
|
Zé
|
5533
|
|
5533
|
João
|
5000
|
|
5000
|
Lima
|
|
|
4444
|
Zé
|
5533
|
|
5533
|
João
|
5000
|
|
5000
|
Lima
|
|
|
5000
|
Lima
|
|
|
5533
|
João
|
5000
|
|
5000
|
Lima
|
|
Se invertermos a cláusula CONNECT BY a ordem dos hierarquia é alterada para cada registros, passando a ser ordenado do maior pai para o menor filho:
select * from
(select 5533 registro, 'João' nome, 5000 registro_pai from dual
union
select 5000 registro, 'Lima' nome, NULL registro_pai from dual
union
select 4444 registro, 'Zé' nome, 5533 registro_pai from dual
union
select 3358 registro, 'Souza' nome, 4444 registro_pai from dual) tabela
connect by prior registro = registro_pai;
Resultado:
|
REGISTRO
|
NOME
|
REGISTRO_PAI
|
|
3358
|
Souza
|
4444
|
|
5533
|
João
|
5000
|
|
4444
|
Zé
|
5533
|
|
3358
|
Souza
|
4444
|
|
4444
|
Zé
|
5533
|
|
3358
|
Souza
|
4444
|
|
5000
|
Lima
|
|
|
5533
|
João
|
5000
|
|
4444
|
Zé
|
5533
|
|
3358
|
Souza
|
4444
|
Se incluírmos a cláusula START WITH podemos definir qual a árvore deve ser exibida excluindo todas as outras da consulta:
select * from
(select 5533 registro, 'João' nome, 5000 registro_pai from dual
union
select 5000 registro, 'Lima' nome, NULL registro_pai from dual
union
select 4444 registro, 'Zé' nome, 5533 registro_pai from dual
union
select 3358 registro, 'Souza' nome, 4444 registro_pai from dual) tabela
connect by prior registro = registro_pai
start with nome = 'Lima';
Resultado:
|
REGISTRO
|
NOME
|
REGISTRO_PAI
|
|
5000
|
Lima
|
|
|
5533
|
João
|
5000
|
|
4444
|
Zé
|
5533
|
|
3358
|
Souza
|
4444
|
Outra caracteristcia muito interessante desse comando é que ele permite a construção de uma estrutura de informações como podem ser observado nas consultas abaixo:
select level
from dual
connect by level <= 10;
Essa consulta retorna os números menor e igual a 10...
|
LEVEL
|
|
1
|
|
2
|
|
3
|
|
4
|
|
5
|
|
6
|
|
7
|
|
8
|
|
9
|
|
10
|
select level - 1 + TO_DATE('01/03/2013','DD/MM/RRRR') dias
from dual
connect by level <= last_day(TO_DATE('01/03/2013','DD/MM/RRRR')) - TO_DATE('01/03/2013','DD/MM/RRRR') + 1;
Essa consulta exibe uma estrutura com todos os dias de um determinado mês...
|
DIAS
|
|
01/03/2013
|
|
02/03/2013
|
|
03/03/2013
|
|
04/03/2013
|
|
05/03/2013
|
|
06/03/2013
|
|
07/03/2013
|
|
08/03/2013
|
|
09/03/2013
|
|
10/03/2013
|
|
11/03/2013
|
|
12/03/2013
|
|
13/03/2013
|
|
14/03/2013
|
|
15/03/2013
|
|
16/03/2013
|
|
17/03/2013
|
|
18/03/2013
|
|
19/03/2013
|
|
20/03/2013
|
|
21/03/2013
|
|
22/03/2013
|
|
23/03/2013
|
|
24/03/2013
|
|
25/03/2013
|
|
26/03/2013
|
|
27/03/2013
|
|
28/03/2013
|
|
29/03/2013
|
|
30/03/2013
|
|
31/03/2013
|
Espero ter contribuído como novos conhecimentos!
Em breve novas dicas ...