Hierarquia com auto-relacionamento
Tenho uma tabela hierárquica de órgãos(departamentos) com os campos idOrgao,SiglaOrgao,NomeOrgao e CodOrgaoPai, formando um auto-relacionamento entre o CodOrgaoPai e o idOrgao. Preciso fazer uma view que me retorne toda a descendência inferior de um órgão x, por exemplo: retornar o id de todos os órgãos abaixo do órgão de idOrgao=222 (Filhos, netos, bisnetos, tataranetos, tatatatatatatatatatatatataranetos e etc de 222).
Socorrooooooo!!!
Grato,
CADU
Socorrooooooo!!!
Grato,
CADU
Cadusantos
Curtidas 0
Respostas
Wcrivelini
27/12/2005
o problema é o seguinte: isso fica fácil de fazer quando se trata de uma hierarquia balanceada com número pré-definido de níveis ou um número máximo de níveis que vc irá definir.
digamos que a hierarquia terá no máximo 5 níveis (quatro níveis acima do original) .
SELECT
A.NomeOrgao AS NIVEL 0,
B.NomeOrgao AS NIVEL 1,
C.NomeOrgao AS NIVEL 2,
D.NomeOrgao AS NIVEL 3,
E.NomeOrgao AS NIVEL 4
FROM TABELA AS A
LEFT JOIN TABELA AS B ON A.CodOrgaoPai = B.idOrgao
LEFT JOIN TABELA AS C ON B.CodOrgaoPai = C.idOrgao
LEFT JOIN TABELA AS D ON C.CodOrgaoPai = D.idOrgao
LEFT JOIN TABELA AS E ON D.CodOrgaoPai = E.idOrgao
WHERE A.idOrgao NOT IN (SELECT CodOrgaoPai FROM TABELA)
este WHERE garante q vc vai começar a lista a partir dos orgãos que não são pais, ou seja, o nível de maior detalhe.
o LEFT JOIN garante que o registro não será perdido caso ele não tenha todos os níveis hierárquicos. mesmo assim, este SELECT pode mostrar um mesmo orgão em vários níveis diferentes se a hierarquia não for balanceada.
digamos que a hierarquia terá no máximo 5 níveis (quatro níveis acima do original) .
SELECT
A.NomeOrgao AS NIVEL 0,
B.NomeOrgao AS NIVEL 1,
C.NomeOrgao AS NIVEL 2,
D.NomeOrgao AS NIVEL 3,
E.NomeOrgao AS NIVEL 4
FROM TABELA AS A
LEFT JOIN TABELA AS B ON A.CodOrgaoPai = B.idOrgao
LEFT JOIN TABELA AS C ON B.CodOrgaoPai = C.idOrgao
LEFT JOIN TABELA AS D ON C.CodOrgaoPai = D.idOrgao
LEFT JOIN TABELA AS E ON D.CodOrgaoPai = E.idOrgao
WHERE A.idOrgao NOT IN (SELECT CodOrgaoPai FROM TABELA)
este WHERE garante q vc vai começar a lista a partir dos orgãos que não são pais, ou seja, o nível de maior detalhe.
o LEFT JOIN garante que o registro não será perdido caso ele não tenha todos os níveis hierárquicos. mesmo assim, este SELECT pode mostrar um mesmo orgão em vários níveis diferentes se a hierarquia não for balanceada.
GOSTEI 0