none
Consultar assuntos com mais niveis abaixo do assunto pai via transact-sql RRS feed

  • 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.

    terça-feira, 4 de novembro de 2014 18:41

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
    quarta-feira, 12 de novembro de 2014 16:26

Todas as Respostas

  • Deleted
    terça-feira, 4 de novembro de 2014 19:23
  • 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.

    terça-feira, 4 de novembro de 2014 19:31
  • 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:

    http://blogs.technet.com/b/bpaulblog/archive/2010/02/28/simplifying-sql-server-joins-query-and-internals.aspx

    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"

    terça-feira, 4 de novembro de 2014 19:45
    Moderador
  • Boa noite Rafa,

    Poste a estrutura da sua tabela.

    Ficaria mais fácil para elaborar uma solução.

    terça-feira, 4 de novembro de 2014 20:15
  • José boa tarde!

    A estrutura é a seguinte:

    Pai
        Filho1
            a
            b
            c
            .
            .
            .
        Filho2
            a
            b
            c
            .
            .
            .

    Eu preciso gerar uma consulta para pegar todos esses registros que estão abaixo do registro pai (filhos e netos).

    Grande abraço.


    quarta-feira, 5 de novembro de 2014 18:47
  • Deleted
    quarta-feira, 5 de novembro de 2014 19:05
  • 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.


    terça-feira, 11 de novembro de 2014 19:44
  • 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

    terça-feira, 11 de novembro de 2014 23:03
  • 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.

    quarta-feira, 12 de novembro de 2014 14:03
  • 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
    quarta-feira, 12 de novembro de 2014 16:26
  • Gapimex boa tarde!

    Muito obrigado pela ajuda e obrigado a todos que colaboraram com este post. Consegui ajustar a consulta e extrair as informações.

    Grande abraço a todos!

    Rafa.

    sexta-feira, 14 de novembro de 2014 18:54