2009-08-26 8 views
2

J'ai une arborescence de base d'entités. L'arbre peut avoir une profondeur maximale de 5 nœuds, mais peut être N nœuds. Je cartographié cette relation dans le tableau similaire à ce qui est indiqué ci-dessous:Question SQL hiérarchique

myID | myDescription | myParentID 

Je commence avec un objet connu, ce qui pourrait se traduire par d'avoir un départ « myID ». Maintenant, je veux obtenir tous les nœuds enfants. Y at-il un moyen d'obtenir tous les nœuds enfants dans une déclaration? Cela doit inclure les enfants de mes enfants et descendre dans l'arbre. J'utilise Oracle SQL.

Merci, Jay

Répondre

4
SELECT * 
FROM mytable 
START WITH 
     myid = :id 
CONNECT BY 
     myparentid = PRIOR myid 
+0

Cela fonctionne uniquement sur Oracle, correct? –

+0

@Eric: Correct, CONNECT BY est une syntaxe de requête Oracle uniquement hiérarchique. –

+0

'@Eric J.': absolument. Dans 'SQL Server' et' PostgreSQL 8.4' vous utilisez 'CTE', pour' PostgreSQL 8.3-'et' MySQL' lisez ces articles dans mon blog: http://explainextended.com/2009/05/29/hierarchical -queries-in-postgresql /, http://explainextended.com/2009/03/17/hierarchical-queries-in-mysql/ – Quassnoi

0

Je suggère d'utiliser une autre façon de modéliser votre hiérarchie si vous voulez récupérer tous les noeuds dans une seule requête. Une très bonne et commune implémentation est le modèle nested set. L'article explique comment cela est implémenté dans MySQL, mais il peut facilement être porté sur Oracle.

+0

C'est un modèle cool, mais pas conseillé pour les mises à jour simultanées sur une grande quantité de données. Ajouter une feuille peut mettre à jour tous les enregistrements de la table. ** Si les données changent rarement, c'est un bon conseil. ** – Christian13467

0

Une façon intéressante de mettre en œuvre ceci est d'ajouter un autre champ qui contient le "chemin" de l'enregistrement. Dites que l'enregistrement supérieur est ID = 1. Il a un enfant avec ID = 5, et il a encore un enfant avec ID = 20, alors le dernier enregistrement aurait le chemin /1/5/20 Donc, si vous voulez tous les nœuds enfants de votre nœud supérieur, faites

select * from MyTable where Path like '/1/%' 

(désolé, la syntaxe du serveur SQL, je ne suis pas un développeur oracle - mais le concept serait encore applicable)

Pour obtenir les enfants du nœud milieu

select * from MyTable where Path like '/1/5/%' 

la chose intéressante à propos de cette solution est que vous pouvez appliquer des index au champ "chemin", donc l'instruction s'exécutera en utilisant seulement un seul balayage d'index le rendant très efficace.