none
Filtro em busca com auto-relacionamento RRS feed

  • Pergunta

  • Tenho uma tabela no banco que tem um auto relacionamento, ex: Matriz > Filial > Unidade > Setor > Seção. Preciso buscar a Filial de um determinada Seção, já fiz a sql que monta essa hierarquia, só que ainda não to conseguindo buscar a Filial da Seção x

    declare @Secao int
    set @Secao = 8;
    
    WITH Hierarquia AS 
    (
        SELECT  a.Codigo, a.Nome, a.Nivel,
               CAST(ROW_NUMBER() OVER (ORDER BY a.Codigo) AS VARCHAR(MAX)) COLLATE Latin1_General_BIN AS bc
        FROM    Area a
        WHERE   AreaIdReference IS NULL 		
        UNION ALL
        SELECT  a.Codigo, a.Nome, a.Nivel,
        Hierarquia.bc + '.' + CAST(ROW_NUMBER() OVER (PARTITION BY a.AreaIdReference ORDER BY a.Codigo) AS VARCHAR(MAX)) COLLATE Latin1_General_BIN    
        FROM    Area a
        JOIN     Hierarquia ON a.AreaIdReference = Hierarquia.Codigo    
    
    )
    SELECT * FROM Hierarquia
    ORDER BY bc

    terça-feira, 28 de maio de 2013 12:36

Respostas

  • Boa tarde,

    Experimente mais ou menos dessa forma:

    declare @Secao int
    set @Secao = 8;
    
    WITH Hierarquia AS 
    (
        SELECT  a.Codigo, a.Nome, a.Nivel, 0 as Filial,
                CAST(ROW_NUMBER() OVER (ORDER BY a.Codigo) AS VARCHAR(MAX)) COLLATE Latin1_General_BIN AS bc
        FROM    Area a
        WHERE   AreaIdReference IS NULL 		
        UNION ALL
        SELECT  a.Codigo, a.Nome, a.Nivel, case when a.Nivel = 2 then a.Codigo else Hierarquia.Filial end,
                Hierarquia.bc + '.' + CAST(ROW_NUMBER() OVER (PARTITION BY a.AreaIdReference ORDER BY a.Codigo) AS VARCHAR(MAX)) COLLATE Latin1_General_BIN    
        FROM    Area a
        JOIN     Hierarquia ON a.AreaIdReference = Hierarquia.Codigo    
    )
    
    SELECT fil.* 
    FROM Hierarquia as sec
    join Hierarquia as fil
        on fil.Codigo = sec.Filial
    where sec.Codigo = @Secao  

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta Pedro Ogm terça-feira, 28 de maio de 2013 18:41
    terça-feira, 28 de maio de 2013 17:53
  • Deleted
    • Marcado como Resposta Pedro Ogm quarta-feira, 29 de maio de 2013 11:17
    terça-feira, 28 de maio de 2013 21:17

Todas as Respostas

  • Boa tarde,

    Experimente mais ou menos dessa forma:

    declare @Secao int
    set @Secao = 8;
    
    WITH Hierarquia AS 
    (
        SELECT  a.Codigo, a.Nome, a.Nivel, 0 as Filial,
                CAST(ROW_NUMBER() OVER (ORDER BY a.Codigo) AS VARCHAR(MAX)) COLLATE Latin1_General_BIN AS bc
        FROM    Area a
        WHERE   AreaIdReference IS NULL 		
        UNION ALL
        SELECT  a.Codigo, a.Nome, a.Nivel, case when a.Nivel = 2 then a.Codigo else Hierarquia.Filial end,
                Hierarquia.bc + '.' + CAST(ROW_NUMBER() OVER (PARTITION BY a.AreaIdReference ORDER BY a.Codigo) AS VARCHAR(MAX)) COLLATE Latin1_General_BIN    
        FROM    Area a
        JOIN     Hierarquia ON a.AreaIdReference = Hierarquia.Codigo    
    )
    
    SELECT fil.* 
    FROM Hierarquia as sec
    join Hierarquia as fil
        on fil.Codigo = sec.Filial
    where sec.Codigo = @Secao  

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta Pedro Ogm terça-feira, 28 de maio de 2013 18:41
    terça-feira, 28 de maio de 2013 17:53
  • Deleted
    • Marcado como Resposta Pedro Ogm quarta-feira, 29 de maio de 2013 11:17
    terça-feira, 28 de maio de 2013 21:17
  • Darei uma olhada nessas referência José
    quarta-feira, 29 de maio de 2013 11:17