Usuário com melhor resposta
Consultar assuntos com mais niveis abaixo do assunto pai via transact-sql

Pergunta
-
Pessoal boa tarde!
Sou novo em programação em banco de dados e gostaria da ajuda de vocês sobre buscar assuntos filho de um determinado registro pai no banco de dados. Segue a imagem da estrutura existente hoje na aplicação:
Eu gostaria de saber se existe alguma função no SQL na qual eu consiga buscar os assuntos filhos ou se alguém tem algum exemplo em que eu possa estudar para gerar minha consulta.
Desde já muito obrigado.
Rafa Santos.
Respostas
-
Boa tarde,
Rafael, acredito que está faltando corrigir a concatenação como sugeri anteriormente.
Experimente fazer um teste com o script abaixo pelo SQL Server Management Studio:
declare @FilteredSubject table (subjectid int, title varchar(40), parentsubject int); insert into @FilteredSubject values (1, 'RECLAMAÇÃO', null), (2, '0LOJA', 1), (3, '041PRODUTO - Marca Terceiros', 2), (4, '0042Troca', 3), (5, '0Desempenho', 4), (6, '0Problena na Válvula', 4); with Assunto (Id, Nome, Nivel, AssuntoCompleto) as ( select subjectid, title, 1, CAST(title as varchar(max)) from @FilteredSubject where parentsubject is null union all select fs.subjectid, fs.title, a.Nivel + 1, CAST(a.AssuntoCompleto + ' >>> ' + fs.title as varchar(max)) from @FilteredSubject fs inner join Assunto a on a.Id = fs.parentsubject ) select Nivel, AssuntoCompleto from Assunto
Espero que ajude.
Assinatura: http://www.imoveisemexposicao.com.br
- Marcado como Resposta Rafa Slevin sexta-feira, 14 de novembro de 2014 18:52
Todas as Respostas
-
-
Boa Tarde Rafa,
Para esse cenário recomendo a utilização de CTE para consulta recursiva, mas dependendo do caso alguns joins mais elaborados podem resolver também essa questão de dados hierárquicos.
Faça a leitura do artigo completo do Thiago Zavaschi:
http://zavaschi.com/?s=cte
Obs: Começa de baixo para cima!
Att, Bruno Silva.
- Sugerido como Resposta Junior Galvão - MVPMVP quarta-feira, 5 de novembro de 2014 13:55
-
Rafa,
Acredito que você poderá obter este relacionamento de dados utilizando as instruções JOIN.
Segue abaixo alguns links que podem ajudar a aprimorar seu conhecimento no assunto:
http://technet.microsoft.com/en-us/library/aa213233(v=sql.80).aspx
http://technet.microsoft.com/en-us/library/aa213232(v=sql.80).aspx
http://technet.microsoft.com/en-us/library/aa259171(v=sql.80).aspx
Este post no Blog TechNet pode ajudar a esclarecer como cada JOIN funciona:
Se ajudou na sua solução, não esqueça de marcar como resposta !
Abraços,
Durval Ramos
Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
----------------------------------
Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil" -
-
-
-
José boa tarde!
Primeiramente muito obrigado pela sugestão de leitura, acredito que o mais interessante neste caso é mesmo utilizando query recursiva, como ainda não tenho muita experiencia com query recursiva fiz a seguinte consulta abaixo:
Só que ainda não me trouxe todos os niveis, posso estar fazendo algo errado. Me trouxe somente 5 niveis abaixo do nivel pai, porém existem mais niveis.
Desde já muito obrigado!
Rafa.
-
Boa noite,
Rafa, acredito que exista um problema na concatenação que é feita na parte recursiva, e que esse problema pode estar criando alguma confusão. Experimente deixar a concatenação da seguinte forma:
,CAST(a.AssuntoCompleto + ' >>> ' + fs.title as varchar(max))
E acredito que o Group By da parte final também não será necessário.
Espero que ajude.
Assinatura: http://www.imoveisemexposicao.com.br
-
Gapimex bom dia!
Mesmo ajustando da forma que você colocou ainda não está descendo para niveis mais baixos, segue um exemplo:
1- Nesta imagem mostra que até aonde está o ultimo nivel de um determinado assunto.
2 - Segue o resultado do ultimo nivel que a query pegou.
Note que além de ter repetido a linha ele não conseguiu trazer os assuntos mais abaixo. Existe algum tipo de limite em relação a niveis em que uma query recursiva pode chegar?
Desde já muito obrigado pela ajuda.
Rafa.
-
Boa tarde,
Rafael, acredito que está faltando corrigir a concatenação como sugeri anteriormente.
Experimente fazer um teste com o script abaixo pelo SQL Server Management Studio:
declare @FilteredSubject table (subjectid int, title varchar(40), parentsubject int); insert into @FilteredSubject values (1, 'RECLAMAÇÃO', null), (2, '0LOJA', 1), (3, '041PRODUTO - Marca Terceiros', 2), (4, '0042Troca', 3), (5, '0Desempenho', 4), (6, '0Problena na Válvula', 4); with Assunto (Id, Nome, Nivel, AssuntoCompleto) as ( select subjectid, title, 1, CAST(title as varchar(max)) from @FilteredSubject where parentsubject is null union all select fs.subjectid, fs.title, a.Nivel + 1, CAST(a.AssuntoCompleto + ' >>> ' + fs.title as varchar(max)) from @FilteredSubject fs inner join Assunto a on a.Id = fs.parentsubject ) select Nivel, AssuntoCompleto from Assunto
Espero que ajude.
Assinatura: http://www.imoveisemexposicao.com.br
- Marcado como Resposta Rafa Slevin sexta-feira, 14 de novembro de 2014 18:52
-