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
    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
    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 éprouvé
    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 : 54
    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
    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
    ?

    @+

  3. #3
    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
    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 éprouvé
    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 : 54
    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
    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 ...

    @+

  5. #5
    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
    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 éprouvé
    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 : 54
    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
    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;
    @+

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    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 éprouvé
    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 : 54
    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
    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.

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, 10h35
  2. Fonction récursive trouver le max dans une liste.
    Par shirohige dans le forum Lisp
    Réponses: 17
    Dernier message: 17/09/2014, 19h54
  3. liste des descendants dans une table hiérarchique
    Par dingoth dans le forum Administration
    Réponses: 4
    Dernier message: 02/11/2008, 20h36
  4. Réponses: 1
    Dernier message: 14/09/2007, 18h04
  5. Trouver une valeur majoritaire dans une liste
    Par gregcat dans le forum Langage
    Réponses: 1
    Dernier message: 22/08/2007, 17h48

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