Le modèle de relation est la table est: p> Comment puis-je obtenir toutes les valeurs liées à la valeur enfant ou père = 2? p> Il doit être p> et non p> 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> 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
3 Réponses :
C'est ce que vous demandez: 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. P> p>
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é.
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);
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
Quelle version d'Oracle utilisez-vous?
Avez-vous entendu parler du mot clé
connect_by_root code>? Vous recherchez et vous aurez votre réponse.