none
Hierarquia no SQL Server 2005 RRS feed

  • Pergunta

  • Tenho o seguinte cenário:

    CREATE TABLE Funcionario(
    FuncionarioID int not null primary key,
    Nome varchar(40) not null,
    Cargo varchar(20) not null,
    ChefeID int null)
    go

    INSERT Funcionario VALUES (1,'Jose','Presidente',null)
    INSERT Funcionario VALUES (2,'Maria','Diretor',1)
    INSERT Funcionario VALUES (3,'Pedro','Diretor',1)
    INSERT Funcionario VALUES (4,'Ana','Gerente',2)
    INSERT Funcionario VALUES (5,'Lucia','Gerente',2)
    INSERT Funcionario VALUES (6,'Ronaldo','Gerente',3)
    INSERT Funcionario VALUES (7,'Marcio','Coordenador',5)
    go


    WITH Organograma (FuncionarioID, Nome, Cargo, ChefeID)
    AS (
    -- Cria a ancora para estabelecer ponto inicial
    SELECT FuncionarioID, Nome, Cargo, ChefeID FROM Funcionario
    WHERE Nome = 'Maria'
    UNION ALL
    -- Cria recursividade
    SELECT f.FuncionarioID, f.Nome, f.Cargo, f.ChefeID
    FROM Funcionario f JOIN Organograma o
    ON f.ChefeID = o.FuncionarioID)

    SELECT * FROM Organograma
    go


    Até ay tudo bem, eu consigo trazer todos os subordinados do Maria.

    Minha duvida é:

    Caso eu tenho um vice presidente na empresa que precise visualizar todos os subordinados.

    INSERT Funcionario VALUES (8,'Carlos','Vice Presidente',null)


    Pesquisando novamente com o ID do vice so consigo visualizar seu proprio registro.
    oq devo fazer para ele visualizar todos os subordinados.?

    WITH Organograma (FuncionarioID, Nome, Cargo, ChefeID)

    AS (

    -- Cria a ancora para estabelecer ponto inicial

    SELECT FuncionarioID, Nome, Cargo, ChefeID FROM Funcionario

    WHERE FuncionarioID = 8

    UNION ALL

    -- Cria recursividade

    SELECT f.FuncionarioID, f.Nome, f.Cargo, f.ChefeID

    FROM Funcionario f JOIN Organograma o

    ON f.ChefeID = o.FuncionarioID)

    SELECT * FROM Organograma

    go

    terça-feira, 17 de fevereiro de 2009 22:12

Respostas

Todas as Respostas

  • Olá Danilo,

    A julgar pelo INSERT, o vice-presidente não tem nenhum subordinado, pois, seu ID é 8 e não há ninguém subordinado a esse ID. Vale a pena lembrar também que se o vice-presidente não é subordinado de ninguém, você terá duas hierarquias (a do presidente e a do vice-presidente).

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com/

    Cálculos financeiros com SQL ? Clique abaixo:
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!361.entry


    Classifique as respostas. O seu feedback é imprescindível
    • Marcado como Resposta Gabriel Marquez segunda-feira, 23 de fevereiro de 2009 20:39
    quarta-feira, 18 de fevereiro de 2009 02:05
  • Pessoal, não é querendo levantar defunto, mas eu entendi o que ele quer. é feito a estrutra árvore que todos nós estudamos no curso superior..
    Vou dá um exemplo
    CREATE TABLE Parcela(
    idParcela int not null primary key,
    valor money not null)

    CREATE TABLE RenegociacaoParcela(
    idRenegociacaoParcela int not null primary key,
    idParcelaAntiga int,

    idParcelaNova int)

     Agora imagina ai que vamos inserir uma parcela de um contrato:
    INSERT Parcela VALUES (1000)
    //ID : 0
    Ai o cara não paga e vamos renegociar a parcela em 2 de 500
    INSERT Parcela VALUES (500) //ID: 1
    INSERT Parcela VALUES (500) //ID: 2
    Pra ficar pior o cara paga a primeira de 500 e não paga a segunda.. vamos reparcelar.
    INSERT Parcela VALUES (250) //ID: 3
    INSERT Parcela VALUES (250) //ID: 4
    Olha o clima ficando pesado...
    Só que essas 2 de 500 é filha da primeira de 1000, e as 2 de 250 e filha da de 500. vamos agora armazenar essa estrutura na tabela de renegociação.
    INSERT RenegociacaoParcela VALUES (0,1)
    INSERT RenegociacaoParcela VALUES (0,2)
    INSERT RenegociacaoParcela VALUES (2,3)
    INSERT RenegociacaoParcela VALUES (2,4)

    Agora quero dá um select de tal maneira que eu informo o id da minha parcela renegociada e o resultado é o histórico do reparcelamento, ou seja..
    idParcelaAntiga idParcelaNova
              0                 2
              0                 3
              2                 3
              2                 4
    sacou?

    ;with historicoRenegociacao (idParcelaAntiga,idParcelaNova,valorParcela)
    AS
    (
    SELECT rp.idParcelaAntiga,P.idParcela,P.valorParcela from Parcela P inner join 
    RenegociacaoParcela rp ON P.idParcela = rp.idParcelaNova WHERE rp.idParcelaAntiga = 1 UNION ALL SELECT rp.idParcelaAntiga,P.idParcela,P.valorParcela from
    Parcela P inner join RenegociacaoParcela rp ON P.idParcela = rp.idParcelaNova INNER JOIN historicoRenegociacao hr ON rp.idParcelaAntiga = hr.idParcelaNova ) --Acho bom pra quem não tá lembrado.. estudar recursão. ou seja qse tods nós rs SELECT TOP 50 * from historicoRenegociacao
    --Lembre-se que essa recursão retornar mais de 100 linhas o sql dá uma exceção ;D
    --Qualquer dúvida: raf.luc@hotmail.com flw JOW.

    Sei q isso parece um abuso a primeira vista, mas se for uma péssima prática.. como seria a boa prática pra modelar essa situação cavernosa?
    • Sugerido como Resposta Rafael S, Lucena domingo, 8 de abril de 2012 00:08
    • Editado Rafael S, Lucena domingo, 8 de abril de 2012 00:14 errei no código e corrigi
    domingo, 8 de abril de 2012 00:08