Você está na página 1de 2

07/11/2017 Gerando uma lista hierarquica com CTEs

Usuários: 76893
Artigos: 226
Dicas: 139
Downloads: 327
07 11 17

Anúncios Google Lista Gerar cte Sql cte

Gerando uma lista hierarquica com CTEs


Data da última atualização: 18/03/2010

Um dos recursos mais interessantes e ainda pouco explorados, introduzido no Firebird 2, são as CTEs (Common Table Expressions).

A sintaxe de uma CTE pode não ajudar, em um primeiro momento, a entendê-la claramente. Mas depois que se acostuma, não fica tão difícil, e os benefícios
que seu uso traz com certeza superam qualquer dificuldade!

Imagine, por exemplo, uma tabela de usuarios e seus respectivos chefes:

CREATE TABLE USUARIOS (


CODIGO INTEGER,
NOME VARCHAR(40),
CHEFE INTEGER
);

E alguns registros de exemplo:

CODIGO NOME CHEFE

1 Rubens null
2 Silvio 1
3 Jose 1

4 Mario 2
5 João 2

6 Ricardo 3
7 Maria 1

Olhando os registros acima, podemos verificar que:

Rubens é o todo poderoso. Silvio, José e Maria são subordinados ao Rubens, enquanto que Mario e João são subordinados ao Silvio, e Ricardo é subordinado a
José.

Imagine que precisamos rodar uma query que retorne todas essas pessoas, em uma sequência lógica de chefes e subordinados. Uma das soluções é criar uma
stored procedure selecionável recursiva, mas neste exemplo, vamos facilitar e utilizar uma CTE:

with recursive HIERARQUIA


as (select U.CODIGO, U.CHEFE, U.NOME, 0 AS NIVEL
from USUARIOS U
where U.CHEFE is null
union all
select U.CODIGO, U.CHEFE, U.NOME, H.NIVEL + 1
from HIERARQUIA H
join USUARIOS U on U.CHEFE = H.CODIGO)

select *
from HIERARQUIA

O resultado:

CODIGO CHEFE NOME NIVEL


1 null Rubens 0

2 1 Silvio 1
4 2 Mario 2
5 2 João 2
3 1 Jose 1

6 3 Ricardo 2
7 1 Maria 1

Façamos agora uma variante. Imagine que você deseja listar os subordinados somente do Silvio. Para isso, modificamos a CTE da seguinte forma:

with recursive HIERARQUIA


as (select U.CODIGO, U.CHEFE, U.NOME, 0 AS NIVEL
from USUARIOS U
where U.CHEFE = :chefe
union all
select U.CODIGO, U.CHEFE, U.NOME, H.NIVEL + 1
from HIERARQUIA H
join USUARIOS U on U.CHEFE = H.CODIGO)

select *
from HIERARQUIA

Executando a query e passando como parâmetro para o chefe o código 2 (Sílvio), teremos como resultado:

https://www.firebase.com.br/artigo.php?id=2166 1/2
07/11/2017 Gerando uma lista hierarquica com CTEs
CODIGO CHEFE NOME NIVEL

4 2 Mario 0
5 2 João 0

E se quisermos que seja listado também o chefe deles? Basta modificarmos a CTE mais uma vez:

with recursive HIERARQUIA


as (select U.CODIGO, U.CHEFE, U.NOME, 0 AS NIVEL
from USUARIOS U
where U.CODIGO = :codigo
union all
select U.CODIGO, U.CHEFE, U.NOME, H.NIVEL + 1
from HIERARQUIA H
join USUARIOS U on U.CHEFE = H.CODIGO)

select *
from HIERARQUIA

Executando a pesquisa e informando o código 2 (= Silvio) para o parâmetro codigo, teremos:

CODIGO CHEFE NOME NIVEL


2 1 Silvio 0
4 2 Mario 1
5 2 João 1

Enfim, esta é apenas uma das possibilidades onde as CTEs ajudam a resolver problemas do dia-a-dia!

Para todos que quiserem se aprofundar no assunto, eu recomendo a leitura dos slides da palestra sobre CTE que o Vlad Khorsun (uma das autoridades no
assunto) deu no 6º FDD. O vídeo da palestra faz parte do DVD do sexto FDD e também do MegaPack.

[]s

Carlos Henrique Cantu


blog.firebase.com.br

Avalie esse artigo: Excelente Avaliar Voltar Curtir 0 Compartilhar Tweetar

Comentários

Ednor Elias Barbosa Júnior [12.09.11]

Interessante! Alguém tem um exemplo de utilização com Delphi CRUD com TreeView?

Adilson de Castro Mutafci [18.09.11]

Gostei muito da explicação e do assunto abordado, pois de uma forma simples e didádica podemos apreender mais um recurso da ferramente que não é muito
divulgada. Gradeço a todos vcs.

Carlos Wilson [05.02.15]

Muito bom. Parabéns!

Welder Vieira de Jesus [05.02.15]

Interessantíssimo!!!!!

Dorgival [01.05.15]

Muito Bom! parabéns!

Luiz Ferrari [10.06.15]

Muito Bem explicado e ótimo exemplo.

HELITON OLIVEIRA [08.10.15]

Ótimo, o exemplo encaixou como uma luva no meu relatório ... Um Abraço.

Atenção! Não poste dúvidas técnicas nos comentários. Para


obter suporte, use a lista de discussão da FireBase.
Inserir comentário

Copyright (c) Carlos H. Cantu - É proibida a reprodução de qualquer material desse site sem autorização prévia

https://www.firebase.com.br/artigo.php?id=2166 2/2