Atravessando dados do tipo árvore em um banco de dados relacional usando SQL

16

Existe uma maneira de atravessar dados de árvore no SQL? Eu sei connect byno Oracle, mas existe outra maneira de fazer isso em outras implementações SQL? Estou perguntando porque usar connect byé mais fácil do que escrever um loop ou função recursiva para executar a consulta para cada resultado.

Como algumas pessoas parecem estar confusas com a frase "dados da árvore", explicarei mais a seguir: O que quero dizer é com relação às tabelas que têm um parent_idcampo ou similar que contém uma chave primária de outra linha da mesma tabela.

A pergunta vem de uma experiência em que eu estava trabalhando com dados armazenados dessa maneira em um banco de dados Oracle e sabia que isso connect bynão foi implementado em outros DBMSs. Se alguém usasse o SQL padrão, teria que criar um novo alias de tabela para cada pai que desejaria subir. Isso pode facilmente sair do controle.

indyK1ng
fonte
Você tem as soluções de Joe Celko. Poucas amostras: Árvores no SQL , Árvores e Hierarquias no Oracle , Modelo de conjunto aninhado . Não é necessário ter açúcar de sintaxe ;-).
Marian

Respostas:

14

O livro de Celko é um bom recurso - às vezes um pouco "acadêmico".

Eu também realmente achei esse método , conhecido como 'tabelas de fechamento', para funcionar bastante bem.

Se você estiver usando um banco de dados que permita CTEs recursivos (como PostgreSQL 8.4 ou mais recente , ou SQL Server 2005 ou mais recente ), eles são realmente o melhor caminho a percorrer. Se você está no Oracle, sempre há o venerável "conectar por" .

É minha experiência que é muito mais comum receber um conjunto de tabelas em um esquema de "árvore ingênua" e ter que descobrir como extrair a árvore correta desse armazenamento, do que ter a oportunidade de criar o limpador estrutura de "tabelas de fechamento".

TML
fonte
9

Um CTE recursivo será sua solução mais fácil. O SQL Server 2005 e as versões atuais do PostgreSQL oferecem suporte a CTEs. Se você estiver usando o SQL Server 2008 ou mais recente, poderá usar o HIERARCHYIDtipo de dados. Você pode encontrar um bom exemplo disso em HierarchyID: Modelar suas hierarquias de dados com o SQL Server 2008

Recursos adicionais:

Jeremiah Peschka
fonte
5

No SQL Server (edições 2005 e posteriores), você pode usar expressões de tabela comuns para ler hierarquias, consulte Microsoft SQL Server 2005 - CTE Exemplo de uma hierarquia simples para alguns exemplos.

Fui recomendado um livro sobre o assunto de maneira mais geral, que é "Árvores e hierarquias no SQL para Smarties", de Joe Celko - embora eu ainda não tenha visto o livro.

David Spillett
fonte
1

O método SQL padrão é uma "consulta recursiva", fornecida pelo CTE recursivo e designada como WITH [ RECURSIVE ]na consulta. A implementação não está especificada na especificação, apenas os métodos disponibilizados para consultar estruturas recursivas. No caso mais simples, a implementação da estrutura de dados requer apenas um ID e um ID pai em uma linha.

Existem também muitas soluções específicas para RDBMS: por exemplo, o PostgreSQL suporta CTEs recursivas, mas também fornece o ltreeque fornece um conjunto diferente de vantagens e desvantagens na implementação.

Você pode encontrar mais informações neste site pesquisando a tag da .

Evan Carroll
fonte