IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

Trouver dernier descendant dans une liste hiérarchique


Sujet :

SQL Oracle

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Développeur Java
    Inscrit en
    Mai 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2016
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Trouver dernier descendant dans une liste hiérarchique
    Bonjour, j'ai parcouru plusieurs forums mais je seche lamentablement.

    J'ai une table du type
    ID FAMILLE PERE ENFANT SEXE
    1 F1 nom1 nom2 M
    2 F1 nom2 nom3 M
    3 F1 nom3 nom4 F
    4 F1 nom4 nom5 M
    5 F2 nom11 nom12 M
    6 F2 nom12 nom13 F
    7 F2 nom13 nom14 M
    8 F3 nom21 nom22 F
    etc...

    Je voudrais trouver tous les liens de parente tel que le résultat soit
    F1 nom1 nom4 F
    F2 nom11 nom13

    Est-ce faisable en une seule requete?

  2. #2
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Bonjour,

    Petite question: quelle serait la règle pour remonter
    F1 nom1 nom4 F
    et non pas
    F1 nom1 nom4
    ,
    sachant que dans l'autre cas tu remonterais
    F2 nom11 nom13
    et pas
    F2 nom11 nom13 F
    ?

    @+
    Aux persévérants aucune route n'est interdite.
    Celui qui ne sait pas se contenter de peu ne sera jamais content de rien.
    Current Status
    Avec 40% de pollinisateurs invertébrés menacés d'extinction selon les Nations Unies, l'homme risque fort de passer de la monoculture à la mono diète...
    Faîtes quelque chose de bien avec vos petits sous: Enfants du Mekong

  3. #3
    Nouveau Candidat au Club
    Femme Profil pro
    Développeur Java
    Inscrit en
    Mai 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2016
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    J'ai fait une erreur de frappe je voudrais retourner la même chose dans les 2 cas:

    F1 nom1 nom4 F
    F2 nom11 nom13 F

  4. #4
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Bonsoir,

    Si on peut se fier sur les colonnes ID et Famille, alors j'aurais tendance a penser que l'on doit pouvoir passer directement avec un "KEEP DENSE_RANK", par ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    WITH src
            AS (SELECT 1 id, 'F1' famille, 'nom1' pere, 'nom2' enfant, 'M' sexe FROM DUAL
                UNION ALL
                SELECT 2 id, 'F1' famille, 'nom2' pere, 'nom3' enfant, 'M' sexe FROM DUAL
                UNION ALL
                SELECT 3 id, 'F1' famille, 'nom3' pere, 'nom4' enfant, 'F' sexe FROM DUAL
                UNION ALL
                SELECT 4 id, 'F1' famille, 'nom4' pere, 'nom5' enfant, 'M' sexe FROM DUAL
                UNION ALL
                SELECT 5 id, 'F2' famille, 'nom11' pere, 'nom12' enfant, 'M' sexe FROM DUAL
                UNION ALL
                SELECT 6 id, 'F2' famille, 'nom12' pere, 'nom13' enfant, 'F' sexe FROM DUAL
                UNION ALL
                SELECT 7 id, 'F2' famille, 'nom13' pere, 'nom14' enfant, 'M' sexe FROM DUAL
                UNION ALL
                SELECT 18 id, 'F3' famille, 'nom21' pere, 'nom22' enfant, 'M' sexe FROM DUAL)
      SELECT a.famille
           , MIN (pere) KEEP (DENSE_RANK FIRST ORDER BY id) premier_nom_famille
           , MAX (pere) KEEP (DENSE_RANK LAST ORDER BY id) dernier_nom_famille
        FROM src a
    GROUP BY a.famille
    Sinon, il te faudra surement partir sur "hierarchical queries", donc voir du côté connect by en utilisant la relation en "pere" et "enfant", etc.

    A voir en fonction de la situtation ...

    @+
    Aux persévérants aucune route n'est interdite.
    Celui qui ne sait pas se contenter de peu ne sera jamais content de rien.
    Current Status
    Avec 40% de pollinisateurs invertébrés menacés d'extinction selon les Nations Unies, l'homme risque fort de passer de la monoculture à la mono diète...
    Faîtes quelque chose de bien avec vos petits sous: Enfants du Mekong

  5. #5
    Nouveau Candidat au Club
    Femme Profil pro
    Développeur Java
    Inscrit en
    Mai 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2016
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    bonjour,

    Merci de votre réponse. Je ne peux pas me fier sur les identifiants. les données ne sont pas chargées dans l'ordre.
    J'ai essayé "connect by" mais je n'ai pas réussi à coder correctement la requete.

  6. #6
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Bonjour,

    Je dirais qqchose comme ca alors:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    WITH src
            AS (SELECT 1 id, 'F1' famille, 'nom1' pere, 'nom2' enfant, 'M' sexe FROM DUAL
                UNION ALL
                SELECT 2 id, 'F1' famille, 'nom2' pere, 'nom3' enfant, 'M' sexe FROM DUAL
                UNION ALL
                SELECT 3 id, 'F1' famille, 'nom3' pere, 'nom4' enfant, 'F' sexe FROM DUAL
                UNION ALL
                SELECT 4 id, 'F1' famille, 'nom4' pere, 'nom5' enfant, 'M' sexe FROM DUAL
                UNION ALL
                SELECT 5 id, 'F2' famille, 'nom11' pere, 'nom12' enfant, 'M' sexe FROM DUAL
                UNION ALL
                SELECT 6 id, 'F2' famille, 'nom12' pere, 'nom13' enfant, 'F' sexe FROM DUAL
                UNION ALL
                SELECT 7 id, 'F2' famille, 'nom13' pere, 'nom14' enfant, 'M' sexe FROM DUAL
                UNION ALL
                SELECT 18 id, 'F3' famille, 'nom21' pere, 'nom22' enfant, 'M' sexe FROM DUAL)
      SELECT id_pere
           , MIN (pere) KEEP (DENSE_RANK FIRST ORDER BY id_pere, lvl) premier_nom_famille
           , MAX (enfant) KEEP (DENSE_RANK LAST ORDER BY id_pere, lvl) dernier_nom_famille
        FROM (    SELECT a.*, LEVEL lvl, CONNECT_BY_ROOT a.pere id_pere
                    FROM src a
              CONNECT BY a.pere = PRIOR a.enfant
              START WITH a.pere NOT IN (SELECT enfant
                                          FROM src))
    GROUP BY id_pere
    ORDER BY 1;
    @+
    Aux persévérants aucune route n'est interdite.
    Celui qui ne sait pas se contenter de peu ne sera jamais content de rien.
    Current Status
    Avec 40% de pollinisateurs invertébrés menacés d'extinction selon les Nations Unies, l'homme risque fort de passer de la monoculture à la mono diète...
    Faîtes quelque chose de bien avec vos petits sous: Enfants du Mekong

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 814
    Points
    17 814
    Par défaut
    Plutôt que de faire l'agrégat, on peut également utiliser connect_by_isleaf.
    J'ai également rajouté la notion de famille dans la hiérarchie, ça me parait important :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    with src (id, famille, pere, enfant, sexe) as
    (
    select  1, 'F1', 'nom1' , 'nom2' , 'M' from dual union all
    select  2, 'F1', 'nom2' , 'nom3' , 'M' from dual union all
    select  3, 'F1', 'nom3' , 'nom4' , 'F' from dual union all
    select  4, 'F1', 'nom4' , 'nom5' , 'M' from dual union all
    select  5, 'F2', 'nom11', 'nom12', 'M' from dual union all
    select  6, 'F2', 'nom12', 'nom13', 'F' from dual union all
    select  7, 'F2', 'nom13', 'nom14', 'M' from dual union all
    select 18, 'F3', 'nom21', 'nom22', 'M' from dual
    )
      ,  cte_src as
    (
     -- Suppression des lignes où les enfants ne sont pas parents
    select famille, pere, enfant, sexe
      from src t1
     where exists (select null
                     from src t2
                    where t2.pere    = t1.enfant
                      and t2.famille = t1.famille)
    )
        select famille
             , connect_by_root pere as root
             , enfant
             , sexe
          from cte_src
         where connect_by_isleaf = 1
    start with (famille, pere) not in (select famille, enfant from src)
    connect by pere    = prior enfant
           and famille = prior famille;
     
    FAMILLE ROOT  ENFANT SEXE
    ------- ----- ------ ----
    F1      nom1  nom4   F
    F2      nom11 nom13  F

  8. #8
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Bonjour,

    Lorsque cef384 disait (suite à ma question sur ID et Famille)
    Je ne peux pas me fier sur les identifiants
    , je pensais qu'elle parlait aussi de "Famille", donc j'avoue qu'au début j'étais un peu perdu.
    De ce fait, je suis parti sur le "connect_by_root", pour tenter de reconstituer quelque chose sur lequel pouvoir faire mon group by.
    Aux persévérants aucune route n'est interdite.
    Celui qui ne sait pas se contenter de peu ne sera jamais content de rien.
    Current Status
    Avec 40% de pollinisateurs invertébrés menacés d'extinction selon les Nations Unies, l'homme risque fort de passer de la monoculture à la mono diète...
    Faîtes quelque chose de bien avec vos petits sous: Enfants du Mekong

Discussions similaires

  1. trouver le max dans une liste
    Par peterpan3000 dans le forum Général Python
    Réponses: 4
    Dernier message: 08/01/2015, 11h35
  2. Fonction récursive trouver le max dans une liste.
    Par shirohige dans le forum Lisp
    Réponses: 17
    Dernier message: 17/09/2014, 20h54
  3. liste des descendants dans une table hiérarchique
    Par dingoth dans le forum Administration
    Réponses: 4
    Dernier message: 02/11/2008, 21h36
  4. Réponses: 1
    Dernier message: 14/09/2007, 19h04
  5. Trouver une valeur majoritaire dans une liste
    Par gregcat dans le forum Langage
    Réponses: 1
    Dernier message: 22/08/2007, 18h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo