Traversée de données arborescentes dans une base de données relationnelle à l'aide de SQL

16

Existe-t-il un moyen de parcourir les données d'arborescence en SQL? Je le sais connect bydans Oracle, mais existe-t-il une autre façon de le faire dans d'autres implémentations SQL? Je demande parce que l'utilisation connect byest plus facile que d'écrire une boucle ou une fonction récursive pour exécuter la requête pour chaque résultat.

Étant donné que certaines personnes semblent être déroutées par l'expression "données d'arbre", je vais expliquer davantage: ce que je veux dire, c'est en ce qui concerne les tables qui ont un parent_idchamp ou similaire qui contient une clé primaire d'une autre ligne de la même table.

La question vient d'une expérience où je travaillais avec des données stockées de cette manière dans une base de données Oracle et savais que ce connect byn'est pas implémenté dans d'autres SGBD. Si l'on devait utiliser du SQL standard, il faudrait créer un nouvel alias de table pour chaque parent que l'on voudrait remonter. Cela pourrait facilement devenir incontrôlable.

indyK1ng
la source
Vous avez les solutions de Joe Celko. Quelques exemples: arbres en SQL , arbres et hiérarchies dans Oracle , modèle d'ensemble imbriqué . Il n'est pas nécessaire d'avoir du sucre de syntaxe ;-).
Marian

Réponses:

14

Le livre de Celko est une bonne ressource - même s'il est parfois un peu trop "académique".

J'ai également trouvé que cette méthode , connue sous le nom de «tables de clôture», fonctionnait assez bien.

Si vous utilisez une base de données qui permet des CTE récursifs (tels que PostgreSQL 8.4 ou plus récent , ou SQL Server 2005 ou plus récent ), ils sont vraiment la meilleure solution. Si vous êtes sur Oracle, il y a toujours le vénérable "se connecter par" .

D'après mon expérience, il est beaucoup plus courant de se voir remettre un ensemble de tables dans un schéma "d'arbre naïf", et de trouver comment extraire l'arbre correct de ce stockage, que d'avoir l'opportunité de créer le nettoyeur structure "tables de fermeture".

TML
la source
9

Un CTE récursif sera votre solution la plus simple. SQL Server 2005 et les versions actuelles de PostgreSQL prennent en charge les CTE. Si vous utilisez SQL Server 2008 ou une version plus récente, vous pouvez utiliser le HIERARCHYIDtype de données. Vous pouvez en trouver un bon exemple dans HierarchyID: modélisez vos hiérarchies de données avec SQL Server 2008

Ressources supplémentaires:

Jeremiah Peschka
la source
5

Dans SQL Server (éditions 2005 et ultérieures), vous pouvez utiliser les expressions de table communes pour lire les hiérarchies, voir Microsoft SQL Server 2005 - Exemple CTE d'une hiérarchie simple pour quelques exemples.

On m'a recommandé un livre sur le sujet plus généralement qui est "Trees and Hierarchies in SQL for Smarties" par Joe Celko - bien que je n'ai pas encore regardé le livre moi-même.

David Spillett
la source
1

La méthode SQL standard est une «requête récursive» fournie par le CTE récursif et désignée comme WITH [ RECURSIVE ]dans la requête. L'implémentation n'est pas spécifiée dans la spécification, seules les méthodes mises à disposition pour interroger les structures récursives. Dans le cas le plus simple, la mise en œuvre de la structure de données nécessite uniquement un ID et un ID parent sur une ligne.

Il existe également de nombreuses solutions spécifiques au SGBDR: par exemple, PostgreSQL prend en charge les CTE récursifs, mais il fournit également ltreedes avantages et des inconvénients différents dans la mise en œuvre.

Vous pouvez trouver plus d'informations sur ce site en cherchant dans la balise .

Evan Carroll
la source