Inquiridor
Ajuda com select

Pergunta
-
Olá pessoal,
Tenho a tabela tdeptos que possui a seguinte estrutura:
IdDepto IdDeptoPai Depto 1 0 Cabos de Áudio 2 0 Cabos de Guitarra 3 1 HDMI 4 1 Vídeo HD 5 2 Student 6 2 Basic Line 7 2 Pro Line
A coluna IdDeptoPai indica a relação entre os deptos e subdeptos. Preciso listá-los na ordem Depto, SubDeptos, Depto, SubDeptos, assim:
IdDepto IdDeptoPai Depto 1 0 Cabos de Áudio 3 1 HDMI 4 1 Vídeo HD 2 0 Cabos de Guitarra 5 2 Student 6 2 Basic Line 7 2 Pro Line
Como posso fazer isso?
Obrigada!
Todas as Respostas
-
-
-
Bom, eu consegui uma solução para você.
Mas você vai precisar fazer uma procedure para poder executar essa query.
Segue abaixo a solução
Por favor, substituir o nome da tabela origem de #teste para o nome da sua tabela real.
Code Snippet--Cria duas variáveis Table, uma para os Pais e uma para o Select Final
declare @tabFinal table(id int identity(1,1), iddepto int, iddeptopai int, depto varchar(100))
declare @tabPais table(id int identity(1,1), iddepto int, iddeptopai int, depto varchar(100))insert into @tabPais(iddepto, iddeptopai, depto)
select iddepto, iddeptopai, depto from #teste where iddeptopai = 0declare @count int
set @count = 0
while not @count > (select count(id) from @tabPais) begin
insert into @tabFinal(iddepto, iddeptopai, depto)
select iddepto, iddeptopai, depto from @tabPais where id = @count
insert into @tabFinal(iddepto, iddeptopai, depto)
select iddepto, iddeptopai, depto from #teste where iddeptopai =
(select iddepto from @tabPais where id = @count)set @count = @count + 1
end
delete from @tabPaisselect iddepto, iddeptopai, depto from @tabFinal
delete from @tabFinal
Espero ter ajudado.
Abraço!!
-
Boa Tarde,
A solução do Eduardo é interessante, mas acho que ela é bem aplicável ao 2000.
Se você estiver com o 2005 ou superiores, sugiro partir para a CTE
Code Snippetdeclare
@t table (IdDepto int, IdDeptoPai int, Depto varchar(30))insert
into @t values (1,0,'Cabos de Áudio')insert
into @t values (2,0,'Cabos de Guitarra')insert
into @t values (3,1,'HDMI')insert
into @t values (4,1,'Vídeo HD')insert
into @t values (5,2,'Student')insert
into @t values (6,2,'Basic Line')insert
into @t values (7,2,'Pro Line')insert
into @t values (8,3,'Teste');with res as (
select
where
IdDeptoPai = 0union all
select
t.IdDepto,t
.Deptofrom
@t as tinner
join res on t.IdDeptoPai = res.IdDepto)select
IdDepto, IdDeptoPai, Depto from resOrder
By IDDeptoPai, IdDeptoSe estiver com o 2008, o HierarchyID também é uma opção
[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.spaces.live.com
-
-
Olá Eduardo,
Não estou desmerecendo sua solução (pra falar a verdade nem cheguei a comparar o desempenho). Não foi informado a versão do SQL Server em questão e se for 2000, possivelmente sua construção é uma ótima alternativa.
O 2005 representa uma "quebra" já que há muitas novidades e recursos que deixam algumas construções do 2000 em desuso. O 2008 também segue a linha, mas a diferença não é tão grande assim.
Esse assunto de recursividade, hierarquias, etc sempre gera dúvidas aqui no fórum, pois, pouca gente conhece e realmente utiliza esse conceito de CTEs recursivas. É um assunto que me interesso muito.
Caso você queria aprofundar-se, recomendo a leitura dos artigos abaixo:
Modelagem de Dados: Hierarquias - Parte 1
http://www.plugmasters.com.br/sys/materias/586/1/Modelagem-de-Dados%3A-Hierarquias---Parte-1
Modelagem de Dados: Hierarquias - Parte 2
http://www.plugmasters.com.br/sys/materias/587/1/Modelagem-de-Dados%3A-Hierarquias---Parte-2
Modelagem de Dados: Hierarquias - Parte 3
http://www.plugmasters.com.br/sys/materias/680/1/Modelagem-de-Dados%3A-Hierarquias---Parte-3
Modelagem de Dados: Hierarquias - Parte 4
http://www.plugmasters.com.br/sys/materias/694/1/Modelagem-de-Dados%3A-Hierarquias---Parte-4Nem sempre o IDPai é a melhor alternativa
[ ]s,
Gustavo Maia Aguiar