none
Recursividade em query? Me ajudem! RRS feed

  • Pergunta

  • Caros,

    tenho um problema e gostaria da ajuda dos experts dos forums.

    Tenho as seguintes tabelas com os principais campos. As tabelas estão devidamente relacionadas pelo ID:

    TB_DIM_PRODUTO (tabela de cadastro para quem não está acostumado com a nomenclatura de tabelas de BI)

    Campos:

    ID_PRODUTO - chave primária artificial numérica
    CD_PRODUTO - chave primária original e única
    NM_PRODUTO
    ID_GERACAO - número que identifica o nível do produto
    CD_PRODUTO_PAI - chave referente ao pai, que é um nível acima. O nível 1 tem esse campo null e ID_GERACAO = 1

    TB_FATO_EXTRATO

    DT_REFERENCIA - Data que compõe a chave composta
    ID_UNIDADE - Unidade a que se refere o registro, tb compõe a PK
    ID_PRODUTO - Relaciona-se com a tabela anterior e compõe a PK
    VL_CONTÁBIL - Valor contábil a ser sumarizado

    O problema:

    Preciso retornar para um relatório a hierarquia de produtos (do nível mais baixo até o mais alto, utilizando os CD_PRODUTO_PAI) e apresentar o VL_CONTABIL. O problema habita em que na TB_FATO_EXTRATO, temos produtos de vários níveis com dados. Não podemos dizer, como regra, que todos os produtos da TB_FATO_EXTRATO são de nível 3 (netos), havendo tb de nível 2.

    Como eu faria pra montar uma query que me retornasse:

    PROD_PAI | PROD_FILHO | PROD_NETO | VL_CONTABIL

    deixando que o campo NETO fique null ou 0 em caso de não existirem os netos?
     
    Não gostaria de usar tabelas temporárias, que a princípio atenderiam a minha necessidade, mas que no futuro eu posso ter n produtos derivantes.

    Espero ter sido claro. Obrigado
    quinta-feira, 27 de março de 2008 01:48

Todas as Respostas

  • Boa Noite Luiz,

     

    Seja bem vindo ao fórum de SQL Server do MSDN.

     

    Teremos prazer em ajudá-lo com suas dúvidas através do nosso conhecimento e disponibilidade.

     

    A construção de hierarquias é certa em projetos de Business Intelligence. Muitas vezes nos deparamos com hierarquias balanceadas onde o número de níveis é conhecido e fixo, mas algumas vezes podemos nos deparar com hierarquias desbalanceadas.

     

    Embora seja possível resolvê-las através da SQL (com as devidas limitações), comumente as ferramentas de BI já estão equipadas para tratá-las além de prover um melhor desempenho. Recomendaria que você tentasse resolver esse problema através de sua ferramenta de BI e não através da SQL.

     

    Trabalhar hierarquias desbalanceadas (ou recursividade como queira) na SQL é um pouco difícil. Não existem operadores próprios para trabalhar esse tipo de construção e os poucos que existem acabam sendo proprietários (a exemplo do Connect By da Oracle e do tipo hierárquico do SQL Server 2008).

     

    Existem algumas saídas (principalmente através de propostas de modelagem alternativas). A representação que você colocou é conhecida como modelo adjacente. Essa proposta é muito típica de aplicações OLTP, mas no mundo OLAP (a exemplo do próprio Ralph Kimball) é melhor você utilizar a técnica de modelagem Bridge Table. Ela tratará de uma forma bem mais fácil a elaboração de consultas.

     

    Já descrevi como fazer isso em alguns artigos. Você poderá encontrá-los nos links abaixo:

     

    http://www.plugmasters.com.br/sys/materias/586/1/Modelagem-de-Dados%3A-Hierarquias---Parte-1

    http://www.plugmasters.com.br/sys/materias/680/1/Modelagem-de-Dados%3A-Hierarquias---Parte-3

     

    Antes de propriamente postar uma solução é fundamental saber qual a versão do SQL Server que você está usando (2000 ou 2005 ?)

     

    [ ]s,

     

    Gustavo

     

    quinta-feira, 27 de março de 2008 02:53
  • Se for em SQL Server 2005, escrevi um artigo sobre queries recursivas, justamente no tratamento de hierarquias.

    http://www.linhadecodigo.com/Artigo.aspx?id=1334

     

    quinta-feira, 27 de março de 2008 14:33