Existe uma maneira de atravessar dados de árvore no SQL? Eu sei connect by
no 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_id
campo 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 by
nã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.
fonte
Respostas:
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".
fonte
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
HIERARCHYID
tipo de dados. Você pode encontrar um bom exemplo disso em HierarchyID: Modelar suas hierarquias de dados com o SQL Server 2008Recursos adicionais:
fonte
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.
fonte
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
ltree
que fornece um conjunto diferente de vantagens e desvantagens na implementação.Você pode encontrar mais informações neste site pesquisando a tag da hierarquia .
fonte