2009-08-24 5 views
1

J'ai une vue de type parent/enfant simple avec deux colonnes: MYID et MYPARENTID. En PL/SQL, obtenir une liste de tous les enfants d'un parent est assez simple:Récupérer des racines avec des nœuds dans une hiérarchie avec PL/SQL

SELECT MYID 
FROM MYVIEW 
START WITH MYID = 'TargetId1' 
CONNECT BY PRIOR MYID = MYPARENTID 

Et je recevrais quelque chose comme ceci:

MYID 
----------- 
TargetId1 
TargetId1Child1 
TargetId1Grandchild1 

Mais maintenant, disons que je veux de faire cela pour un couple de parents, à la fois:

SELECT MYID 
FROM MYVIEW 
START WITH MYID IN ('TargetId1', 'TargetId2', 'TargetId3') 
CONNECT BY PRIOR MYID = MYPARENTID 

Mon résultat ressemble à ceci:

MYID 
--------- 
TargetId1 
TargetId1Child1 
TargetId1Grandchild1 
TargetId2 
TargetId2Child2 
TargetId2Grandchild1 
TargetId3 
TargetId3Child3 
TargetId3Grandchild1 

Lorsque je le fais de cette façon, je perds la capacité de savoir d'où vient un nœud enfant particulier. Je récupère une liste d'enfants, mais je veux savoir quelle racine (essentiellement, la valeur START WITH) chaque enfant est originaire;

Je veux un jeu de résultats qui ressemble à ceci:

MYID     ROOT 
---------------------------------- 
TargetId1    TargetId1 
TargetId1Child1   TargetId1 
TargetId1Grandchild1 TargetId1 
TargetId2    TargetId2 
TargetId2Child2   TargetId2 
TargetId2Grandchild2 TargetId2 
TargetId3    TargetId3 
TargetId3Child3   TargetId3 
TargetId3Grandchild3 TargetId3 

Comment puis-je faire cela?

Répondre

1

Je ne l'ai pas utilisé moi-même, mais d'après ma compréhension de votre question, je pense que l'opérateur CONNECT_BY_ROOT est ce que vous recherchez. Requiert Oracle 10g, cependant.

SELECT MYID 
     ,CONNECT_BY_ROOT MYID ROOT 
FROM MYVIEW 
START WITH MYID IN ('TargetId1', 'TargetId2', 'TargetId3') 
CONNECT BY PRIOR MYID = MYPARENTID 
+0

Excellent! Merci beaucoup. – DivisionByZorro

0

Je ne sais pas PL/SQL, mais vous pourriez être en mesure de:

  • Insérer la liste TargetId dans une table temporaire
  • joindre à la table temporaire en vue

Par exemple

CREATE TABLE #Parents (TargetId) 

INSERT INTO #Parents TargetId1 
INSERT INTO #Parents TargetId2 
... 
INSERT INTO #Parents TargetId10 

SELECT MYID, #Parents.TargetID 
FROM MYVIEW, #Parents 
CONNECT BY MYID = #Parents.TargetID 
CONNECT BY PRIOR MYID = MYPARENTID 
+0

Le code SQL en question sera généré et exécuté par un service Web; Je ne pense pas que le SLA avec la DB va nous permettre d'utiliser des tables temporaires pour terminer l'opération. – DivisionByZorro

Questions connexes