8
votes

Comment obtenir toutes les valeurs dans la hiérarchie liée à une certaine valeur en utilisant Oracle Connect par

Le modèle de relation est xxx pré>

la table est: p> xxx pré>

Comment puis-je obtenir toutes les valeurs liées à la valeur enfant ou père = 2? p>

Il doit être p> xxx pré>

et non p> xxx pré>

car il n'est pas lié à la valeur 2. P>

Comment y parvenir en utilisant Connect par relevé? Merci. P>

P.s. Cette solution est très proche de moi mais ne fonctionne pas pour mon modèle: p>

Trouver tous les nœuds dans un modèle de liste de adjacents avec Oracle Connect par P>

DB Version - 10.2.0.5.0 P>

Modèle-with-oracle-connect- par p>

Ainsi, la stratégie avant peut être comme celle-ci (par exemple, commencez par le nœud = 7): p>

étape 1 (direction = up) p> xxx Pré>

résultat est de 7,2,1,3 où 1,3 est une racine de haut niveau (isleaf = 1) p>

étape 2 (Obtenir la route pour 1,3 direction = DOWN) P >

select t1.father,connect_by_root father as root,connect_by_isleaf from 
(my_table) t1
start with child=6
connect by prior father = child 


2 commentaires

Quelle version d'Oracle utilisez-vous?


Avez-vous entendu parler du mot clé connect_by_root ? Vous recherchez et vous aurez votre réponse.


3 Réponses :


0
votes

C'est ce que vous demandez: xxx

Cette requête consiste en deux blocs. Premier bloc d'extrait de tous les enfants de tous les pères de 2 (paramètre), deuxième bloc (avec union à éviter les doublons) extrait tous les pères de tous les enfants de 2.


11 commentaires

Frais! Merci. Je vais vérifier ma réponse


Merci mais j'ai une table avec des relations clients dans ce format. Exemple simple - 1 Le père de 2 et 2 est père de 3 et 4 est père de 5. Dans cet exemple, j'ai deux arbres 1,2,3 et 4,5. Quand je connais le client 2, j'ai besoin d'obtenir 1,2,3.


Est id2 ou id1 le "champ père"? Pourriez-vous modifier votre question Changer de champs Nom pour un meilleur détournement?


Merci beaucoup pour toi le temps! J'ai édité ma question pour une meilleure compréhension. Son modèle de relation mes clients. Malheureusement, je n'ai pas de disques où le champ de père est null.


OK, maintenant que vous avez changé l'exemple que j'ai reformulé le code. Il extrait ce que vous avez demandé.


Le résultat est de 1,2,3,4,6,7 nœud = 5 est manquant :(


Et ce que je dois faire quand je commence avec le noeud père? Comme 1 ou 3. Merci.


C'est très proche ... mais si je commence avec enfant = 4, je reçois 2,3,4,6,7 (sans 5 et 1) :(


Vous avez demandé 2;). Sérieusement, si vous voulez une solution générale à ce problème, je pense que vous devez aller procédural avec PL / SQL O quelle que soit la langue que vous préférez. IIRC, je pense que vous avez formulé ce problème de science informatique classique: en.wikipedia.org/wiki/... . Ainsi, récupérez toute implémentation que vous pouvez en trouver, chargez des données de DB et une fois que vous avez des composants fortement connectés, vous n'avez que vous n'avez que pour trouver le CCN d'un élément. Bien sûr, si vous pouvez faire des hypothèses sur votre modèle, vous pouvez peut-être éviter cet algorithme.


Ou plus simple, vous pouvez obtenir le résultat de la requête que je vous ai fournie et postuler à nouveau la requête sur tous les résultats jusqu'à ce que votre ensemble ne change pas. Par exemple. Si vous commencez avec 4, vous obtenez 2,3,4,6,7. Appliquez à nouveau la requête sur 2,3,6,7. Lorsque vous postulez sur 2, vous voyez que le résultat est de 1,2,3,4,5,6,7 et cela ne change plus.


Merci beaucoup pour vos réponses. Oui, je peux écrire une fonction avec PL / SQL et peut-être que cela peut être plus rapide que de sélectionner sur Connect par relevé.



0
votes

Si je vous ai bien compris, vous pouvez utiliser la fonction Connect_By_ROOT comme ci-dessous:

select hier.child , hier.father
from 
(
  select t.* , connect_by_root(father) top_father
  from 
  (
    select 2 child, 1 father from dual
    union all
    select 2 child, 3 father from dual
    union all
    select 4 child, 3 father from dual
    union all
    select 7 child, 2 father from dual
    union all
    select 6 child, 5 father from dual
    union all
    select 6 child, 7 father from dual
    union all
    select 9 child, 8 father from dual
  ) t
  connect by t.child = prior t.father
) hier
where 2 in (hier.child , hier.top_father);


0 commentaires

3
votes

Pour votre sortie, vous n'avez pas besoin de votre graphique pour être dirigé, ajoutez donc les liens inverse à tous les liens existants. C'est ce que je fais dans la sous-requête 'BI'. Ensuite, vous utilisez un nocyle Connect par requête.

    with h as (
                     SELECT 2 child, 1 father FROM dual
                     UNION ALL
                     SELECT 2 child, 3 father FROM dual
                     UNION ALL
                     SELECT 4 child, 3 father FROM dual
                     UNION ALL
                     SELECT 7 child, 2 father FROM dual
                     UNION ALL
                     SELECT 6 child, 5 father FROM dual
                     UNION ALL
                     SELECT 6 child, 7 father FROM dual
                     UNION ALL
                     SELECT 9 child, 8 father FROM dual
            ),
    bi as (select * from h union all select father , child from h )     
    select distinct father from bi
    start with child = 2
    connect by nocycle
    prior father = child


0 commentaires