none
Hierarquia - SQL Server 2005 RRS feed

  • Pergunta

  • Pessoal, estou com um problema aqui e achei apenas uma solução para ele, gostaria de ter mais opções de escolha, se houver.

    Tenho a seguinte tabela:

    (PK) IdMeta
    DescMeta

    Com os dados:

    1 - Passar no vestibular.
    2 - Tirar certificação.
    3 - Arranjar um emprego.

    Para eu atingir a meta 3 eu tenho que obrigatoriamente atingir a 1 e a 2 primeiro.
    O que eu posso fazer para criar essa estrutura? Seria algo com a meta 3 tem dois filhos, a meta 1 e a 2.

    A única solução que eu achei foi criar uma outra tabela com:

    (FK) IdMeta
    (FK) IdMetaRequisito

    E eu teria os dados:

    IdMeta:  3
    IdMetaRequisito: 1

    IdMeta:  3
    IdMetaRequisito: 2

    Lembrando que um meta pode não ter requisitos.
    Alguem tem outra solução?

    Agradeço.
    domingo, 29 de junho de 2008 16:45

Todas as Respostas

  • Boa Tarde,

     

    Creio que essa seja a maneira mais adequada de fazer isso. Como você ainda conta com o SQL Server 2005. As Common Table Expressions (CTEs) podem ajudá-lo bastante na tarefa de montar consultas hierárquicas. Segue um pequeno exemplo

     

    Code Snippet

    -- Descrição das metas

    CREATE TABLE tblMetas (

    IDMeta INT,

    DescMeta VARCHAR(80),

    CONSTRAINT PK_Meta PRIMARY KEY (IDMeta))

     

    -- Criação dos Pré-requisitos

    CREATE TABLE tblPreRequisitos (

    IDMeta INT,

    IDMetaPreRequisito INT)

     

    -- Popular as metas

    INSERT INTO tblMetas VALUES (1, 'Terminar o segundo grau')

    INSERT INTO tblMetas VALUES (2, 'Passar no vestibular')

    INSERT INTO tblMetas VALUES (3, 'Obter a certificação MCTS')

    INSERT INTO tblMetas VALUES (4, 'Arranjar um emprego')

    INSERT INTO tblMetas VALUES (5, 'Obter a certificação MCITP')

    INSERT INTO tblMetas VALUES (6, 'Fazer uma pós-graduação')

    INSERT INTO tblMetas VALUES (7, 'Fazer um mestrado')

     

    -- Popular os pré-requisitos

    INSERT INTO tblPreRequisitos VALUES (2,1)

    INSERT INTO tblPreRequisitos VALUES (3,1)

    INSERT INTO tblPreRequisitos VALUES (4,2)

    INSERT INTO tblPreRequisitos VALUES (4,3)

    INSERT INTO tblPreRequisitos VALUES (5,3)

    INSERT INTO tblPreRequisitos VALUES (5,4)

    INSERT INTO tblPreRequisitos VALUES (6,4)

    INSERT INTO tblPreRequisitos VALUES (7,6)

     

    WITH Planejamento AS (

    SELECT IDMeta AS Meta, 1 As Niv FROM tblMetas

    WHERE IDMeta NOT IN (

    SELECT DISTINCT IDMeta FROM tblPreRequisitos)

     

    UNION ALL

     

    SELECT IDMeta, PLN.Niv + 1 FROM tblPreRequisitos AS PR

    INNER JOIN Planejamento AS PLN ON PR.IDMetaPreRequisito = PLN.Meta),

     

    Quadro AS (

    SELECT Meta AS IdMeta, MAX(Niv) AS MaxNiv FROM Planejamento

    GROUP BY Meta)

     

    SELECT REPLICATE('--',MaxNiv) + ' ' + DescMeta

    FROM tblMetas

    INNER JOIN Quadro ON tblMetas.IDMeta = Quadro.IDMeta

     

    [ ]s,

     

    Gustavo

    domingo, 29 de junho de 2008 19:30