Select com estrutura em Arvore

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
jsthiagosp
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Qua, 14 Jan 2009 8:01 pm
Localização: São Paulo

Salve galera, recorro a vocês do forum aqui para uma ajudinha com um SELECT que venho quebrando a cabeça.

Tenho a seguinte tabela funcionários
id_funcionario (PK) NUMBER
id_funcionario_reponde_a (FK) NUMBER
Nome_funcionario VARCHAR2(60)

Como vocês já devem ter notado, existe uma auto-relacionamento nessa tabela envolvendo id_funcionario e id_funcionario_responde_a.


===========================

Selecionar tudo

Exemplo de dados dessa Tabela
id_funcionario | id_funcionario_responde_a |  Nome_funcionario
001                |                       |  Rodrigo Silva
002                | 001                   |  Marcelo Oliveira
003                | 002                   |  Juliana Costa
004                | 003                   |  Pedro Henrique
005                | 004                   |  Mariane Oliveira
006                |                       |  Carlos Eduardo
007                |                       |  Ronaldo Oliveria
008                | 007                   | Cristiano Silva
009                | 008                   | Roberto Maia
010                |                       | Julia Matias
011                | 010                   | Carla Cristina

===========================
Oque estou precisando é um SELECT que traga uma informação semelhante a essa:

Selecionar tudo

id_funcionario | id_funcionario_responde_a |  Chefe_Raiz
001                |                       |  
002                | 001                   |  001
003                | 002                   |  001
004                | 003                   |  001
005                | 004                   |  001
006                |                       |  
007                |                       |
008                | 007                   | 007
009                | 008                   | 007
010                |                       |
011                | 010                   | 010
Ou seja; uma coluna que mostre em todos os registros filhos quem é o id do registro Raiz (inicio) da arvore.

Algum já passou por isso, ou tem alguma dica de como conseguiria resolver esse enigma com Select em banco de dados Oracle ?

Valeu

Thiago
burga
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Qui, 26 Nov 2009 1:05 pm
Localização: SP
Ricardo H. Tajiri

Use o connect_by_root pra isso. Algo do tipo:

Selecionar tudo

SELECT id_funcionario funcionario, 
  id_funcionario_responde_a superior_direto, 
  CONNECT_BY_ROOT superior_raiz, 
  LEVEL nivel_hierarquia
FROM funcionarios
START WITH id_funcionario_responde_a IS NULL
  CONNECT BY NOCYCLE PRIOR 
    id_funcionario = id_funcionario_responde_a;
Abraços,
jsthiagosp
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Qua, 14 Jan 2009 8:01 pm
Localização: São Paulo

Obrigado burga pela dica, baseando na sua resposta consegue resolver o problema.

Deixo abaixo o SQL que gerei que resolveu o meu problema, caso alguém mais venha precisar de algo parecido.

Selecionar tudo

SELECT  f.id_funcionarios                                                         funcionario
       ,f.nome                                                                    nome
       ,f.id_funcionarios_responde_a                                              superior_direto
       ,nvl2(f.id_funcionarios_responde_a, CONNECT_BY_ROOT f.id_funcionarios, '') chefe_Raiz
       ,SYS_CONNECT_BY_PATH(f.nome, ' / ')                                        caminho

FROM funcionario f
START WITH f.id_funcionarios_responde_a is null
CONNECT BY PRIOR f.id_funcionarios = f.id_funcionarios_responde_a 

Valeu galera

Abraço a todos.

Thiago
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 29 visitantes