2010-11-07 5 views
1

J'ai créé un arbre 'bottom-up' dans mes tables de base de données SQL où chaque élément a une colonne pour une référence à son parent. Maintenant j'essaye de savoir s'il y a une question facile pour obtenir tous les parents d'un enfant.Comment obtenir des éléments 'liés' dans une requête SQL

Par exemple:

      [ Parent #1 ] 
           | 
       [Parent #2]    [Parent #3] 
        |      | 
     [Child # 1] [Child #2] [Child #3] [Child #4] 

Je donne enfant # 1 comme 'ID'. Chaque entrée a une référence à son parent, et le parent le plus élevé est null pour l'ID parent. Ainsi, plutôt que dans mon code récursif et obtenant chaque parent, j'espérais qu'il y avait une requête que je pourrais faire qui obtiendrait Parent 1 id, parent 2 id, et enfant 1 id en fournissant juste l'ID de l'enfant 1.

+3

Quel type de base de données utilisez-vous? S'il vous plaît ajouter la balise appropriée (oracle, sql-server, mysql, ...) –

+0

Désolé ... c'est une base de données Oracle 10 –

Répondre

2

Vous voudriez utiliser une requête hiérarchique, en utilisant les clauses START WITH et CONNECT BY. Voir this link.

+0

Merci .. ce lien m'a aidé à comprendre ce que vettipayyan essayait de dire ... devinez-le était juste un problème de syntaxe dans sa réponse qui m'a troublé. –

1

C'est juste une extraction hiérarchique
J'ai deviné une requête, donc les améliorations sont les bienvenues.

SELECT node_id
FROM tree
WHERE child_id="child_1"
START WITH id="child_1" CONNECT BY PRIOR parent_id=child_id;

+0

Hmm .... votre syntaxe peut me dérouter un peu. Node_id est-il identique à child_id? Parce que la seule chose que je dois commencer est 'child_id'. Et chacun de mes noeuds subséquents «en haut» de l'arbre n'a aucun lien avec leurs enfants. C'est une façon de faire des connexions tout le long. Donc, le fait de dire parent_id = child_id n'a pas beaucoup de sens pour moi non plus. Donc, fondamentalement, je commence par id1 (qui est l'enfant le plus bas), puis j'obtiens le parent pour id1 qui est id2. Une fois que j'ai id2, je ne sais pas qui est l'enfant, mais seulement qui est le parent. –

+0

tu l'as dit. problème de syntaxe. De toute façon vous avez une solution! . Si vous postez la requête exacte, elle est utile pour d'autres personnes qui cherchent des problèmes similaires (Votre question est utile à ceux qui se préparent pour OCA) – vettipayyan

0

Vous pouvez également utiliser un nested set ou adjacency model. Les deux ont l'avantage de fonctionner avec n'importe quelle base de données SQL. Le modèle de contiguïté fonctionne uniquement avec un petit nombre limité de profondeurs d'imbrication, tandis qu'un ensemble imbriqué peut être imbriqué avec une profondeur illimitée.

Questions connexes