Tenho uma tabelas órgãos que necessito apresentar uma hierarquia.
select * from orgaos
codigo |
codigo_pai |
sigla |
3 |
2 |
SAGI |
1 |
null |
PR |
4 |
3 |
DGI |
5 |
3 |
DFD |
6 |
3 |
DM |
7 |
3 |
DA |
2 |
1 |
MDS |
12 |
1 |
MTE |
13 |
1 |
MRE |
11 |
3 |
Gab/SAGI |
Para representar este organograma
A consulta abaixo:
with recursive org (sigla, codigo, codigo_pai, path,deep,nome) as (
select sigla, codigo, codigo_pai, array[codigo],1, nome
from orgaos
where codigo_pai is null
union all
select o1.sigla, o1.codigo, o1.codigo_pai, path || o1.codigo ,o2.deep+1, o1.nome
from orgaos o1, org o2
where o2.codigo = o1.codigo_pai
)
select * from org
me gerou
orgao |
orgao_pai |
sigla |
path |
deep |
1 |
|
PR |
{1} |
1 |
2 |
1 |
MDS |
{1,2} |
2 |
3 |
2 |
SAGI |
{1,2,3} |
3 |
4 |
3 |
DGI |
{1,2,3,4} |
4 |
5 |
3 |
DFD |
{1,2,3,5} |
4 |
6 |
3 |
DM |
{1,2,3,6} |
4 |
7 |
3 |
DA |
{1,2,3,7} |
4 |
11 |
3 |
Gab/SAGI |
{1,2,3,11} |
4 |
12 |
1 |
MTE |
{1,12} |
2 |
13 |
1 |
MRE |
{1,13} |
2 |