Array
(
)

Hierarquia com auto-relacionamento

Cadusantos
   - 27 dez 2005

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

Wcrivelini
   - 06 jan 2006

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.