none
Ajuda com select RRS feed

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







    quarta-feira, 14 de janeiro de 2009 16:39

Todas as Respostas

  • Olá,

     

    Nossa não entendi o que você quer fazer.

     

     

     

    quarta-feira, 14 de janeiro de 2009 17:19
  •  

    Agora entendi.

     

    Você tem uma tabela única com pais e filhos.

     

    Nossa Smile seria mais fácil usar duas tabelas.

     

    Vou tentar fazer aqui, se conseguir posto a query.

     

    Abraço!

    quarta-feira, 14 de janeiro de 2009 17:34
  • 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 = 0

     

    declare @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 @tabPais

     

    select iddepto, iddeptopai, depto from @tabFinal

     

    delete from @tabFinal

     

     


    Espero ter ajudado.

     

    Abraço!!

    quarta-feira, 14 de janeiro de 2009 17:56
  • 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 Snippet

    declare @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 IdDepto, IdDepto As IdDeptoPai, Depto from @t

    where IdDeptoPai = 0

     

    union all

     

    select t.IdDepto,

    case res.IdDeptoPai when 0 then res.IdDepto else res.IdDeptoPai end,

    t.Depto

    from @t as t

    inner join res on t.IdDeptoPai = res.IdDepto)

     

    select IdDepto, IdDeptoPai, Depto from res

    Order By IDDeptoPai, IdDepto

     

    Se estiver com o 2008, o HierarchyID também é uma opção

     

    [ ]s,

     

    Gustavo Maia Aguiar

    http://gustavomaiaaguiar.spaces.live.com

     

    quarta-feira, 14 de janeiro de 2009 18:29
  • Olá Gustavo.

     

    Bem legal o que você fez.

     

    Eu não tenho muito conhecimento sobre o 2005, estou meio parado no tempo Smile

     

    Vou dar uma pesquisada sobre o que você fez, aprender é sempre bom Smile

     

    Abraço!!

     

    quinta-feira, 15 de janeiro de 2009 10:58
  • 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-4

     

    Nem sempre o IDPai é a melhor alternativa

     

    [ ]s,

     

    Gustavo Maia Aguiar

    http://gustavomaiaaguiar.spaces.live.com

    quinta-feira, 15 de janeiro de 2009 11:14