web-dev-qa-db-fra.com

Traverser des données de type arborescentes dans une base de données relationnelle à l'aide de SQL

Y a-t-il un moyen de traverser les données d'arbres dans SQL? Je sais sur connect by à Oracle, mais y a-t-il une autre façon de le faire dans d'autres implémentations SQL? Je demande parce que vous utilisez connect by est plus facile que d'écrire une boucle ou une fonction récursive pour exécuter la requête pour chaque résultat.

Comme certaines personnes semblent être confondues par la phrase "Données d'arbres", je vais expliquer davantage: ce que je veux dire, c'est en ce qui concerne les tables qui ont un parent_id ou champ similaire contenant une clé primaire d'une autre ligne de la même table.

La question provient 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 savait que le connect by n'est pas implémenté dans d'autres DBMS. Si l'on utilisait SQL standard, il faudrait créer un nouvel alias de table pour chaque parent voudrait augmenter. Cela pourrait facilement sortir de la main.

16
indyK1ng

book de Celko est une bonne ressource - si un peu trop excessivement "universitaire" parfois.

J'ai aussi beaucoup trouvé cette méthode , appelée "tables de fermeture" pour travailler assez bien.

Si vous utilisez une base de données qui permet des CTES récursifs (tels que PostgreSQL 8.4 ou plus récent , ou SQL Server 2005 ou plus récent ), c'est vraiment le meilleur moyen d'aller . Si vous êtes sur Oracle, il y a toujours la vénérable "Connect by" .

C'est mon expérience qu'il est bien plus fréquent de recevoir un ensemble de tables dans un schéma "naïf arbre" et de comprendre comment extraire l'arborescence correcte de ce stockage, que ce soit la possibilité de créer le nettoyeur Structure de "tables de fermeture".

14
TML

Un CTE récursif va être votre solution la plus facile. SQL Server 2005 et versions actuelles des CTES de support PostgreSQL. Si vous utilisez SQL Server 2008 ou plus récent, vous pouvez utiliser le type de données HIERARCHYID. Vous pouvez trouver un bon exemple de ceci à hiérarchyide: modéliser vos hiérarchies de données avec SQL Server 2008

Ressources additionnelles:

9
Jeremiah Peschka

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

J'ai recommandé un livre sur le sujet plus généralement qui est "arbres et hiérarchies dans SQL pour Smarties" de Joe Celko - bien que je n'ai pas encore regardé le livre moi-même.

5
David Spillett

La méthode SQL standard est une "requête récursive" qui est fournie par le CTE récursif et désigné comme WITH [ RECURSIVE ] Dans la requête. La mise en œuvre n'est pas spécifiée dans la spécification, seules les méthodes disponibles pour les structures de requête récursives. Dans le cas le plus simple, la mise en œuvre de la structure de données ne nécessite qu'une ID et une pièce d'identité parent sur une ligne.

Il existe également de nombreuses solutions spécifiques aux RDBMS: par exemple, PostgreSQL prend en charge des CTES récursifs, mais elle fournit également ltree qui fournit un ensemble d'avantages et d'inconvénients différents dans la mise en œuvre.

Vous pouvez trouver plus d'informations sur ce site en effectuant une recherche via la balise hiérarchie étiquette.

1
Evan Carroll