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 :

Requête "doublement" récursive


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Avatar de Manopower
    Inscrit en
    Décembre 2003
    Messages
    516
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 516
    Par défaut Requête "doublement" récursive
    Bonjour,
    voici le contexte.

    J'ai une table collaborateur, qui a un Type_collab. Chaque collab a un "chef" qui est lui même un collab

    un collab de type ingénieur a forcément dans sa hierarchie un collab de type chef de projet.

    un collab de type chef de projet a forcément dans sa hierarchie un collab de type manager.

    un collab de type directeur n'a pas de chef (idHierarchie = null)

    Le problème c'est qu'un ingénieur peut avoir dans sa hierarchie un ingénieur senior entre lui et son chef de projet, voir même un chef d'équipe ...
    Le chef de projet peut lui être rattaché directement au manager ou bien avoir un directeur de projet...

    Je sais écrire la requête afin de récupérer le chef de projet de chaque ingénieur.
    Je sais écrire la requête afin de récupérer le manager de chaque chef de projet

    J'ai besoin de votre aide pour écrire la requête me permettant de connaitre le chef de projet et son manager pour chaque ingénieur !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT c.nom  AS ingenieur,
            connect_by_root c.nom AS ChefDeProjet
    FROM Collab c, Type_collab t
    WHERE c.idtypCollab = t.idTypCollab 
      AND t.codTypeCollab not in ('CP','MANAGER')
      AND connect_by_isleaf = 1   
    START WITH t.codTypeCollab = 'CP'
    CONNECT BY PRIOR c.idCollab = c.idHierarchie
    Résultat obtenu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Ingenieur  ChefDeProjet
    Bob         Michel
    Luke        Michel
    Franck      Michel
    Julie         Simon
    Sylvain      Simon 
    Rachid      Benoit
    Sophie      Benoit
    Résultat attendu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Ingenieur  ChefDeProjet  Manager
    Bob          Michel           François
    Luke         Michel           François
    Franck      Michel           François
    Julie         Simon            Jérôme
    Sylvain     Simon            Jérôme
    Rachid      Benoit           François
    Sophie      Benoit           François
    Si vous avez une idée pour faire ça, je suis preneur !
    merci d'avance !

  2. #2
    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
    Il manque les données de départ !

  3. #3
    Membre chevronné
    Avatar de Manopower
    Inscrit en
    Décembre 2003
    Messages
    516
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 516
    Par défaut
    En effet,
    voici le jeu d'essai concernant les résultats indiqués dans le premier message.
    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
    Table Collab join TypeCollab
    id nom libelleType id_Hierarchie
    1 Bob   Ingénieur      10
    2 Luke  Ingénieur      8
    3 Franck  Ingénieur    10
    4 Julie Ingénieur        12
    5 Sylvain Ingénieur     11 
    6 Rachid Ingénieur     13
    7 Sophie Ingénieur     13
    8 Suzanne IngéSenior 9
    9 Fred ChefEquipe 10
    10 Michel CP 15
    11 Lucie ChefEquipe 12
    12 Simon CP 16
    13 Benoit CP 14
    14 Mathieu DirecteurProjet 15
    15 Francois Manager 17
    16 Jérome Manager 17
    17 Xavier Directeur null
    merci !

  4. #4
    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
    J'ai utilisé cette solution là, pas complètement satisfaisante car j'ai supposé que CP était toujours juste en-dessous de Manager :
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    With MaTable as
    (
    select  1 as id, 'Bob' as nom, 'Ingénieur' as libelleType, 10 as id_Hierarchie from dual union all
    select  2      , 'Luke'      , 'Ingénieur'               ,  8                  from dual union all
    select  3      , 'Franck'    , 'Ingénieur'               , 10                  from dual union all
    select  4      , 'Julie'     , 'Ingénieur'               , 12                  from dual union all
    select  5      , 'Sylvain'   , 'Ingénieur'               , 11                  from dual union all
    select  6      , 'Rachid'    , 'Ingénieur'               , 13                  from dual union all
    select  7      , 'Sophie'    , 'Ingénieur'               , 13                  from dual union all
    select  8      , 'Suzanne'   , 'IngéSenior'              ,  9                  from dual union all
    select  9      , 'Fred'      , 'ChefEquipe'              , 10                  from dual union all
    select 10      , 'Michel'    , 'CP'                      , 15                  from dual union all
    select 11      , 'Lucie'     , 'ChefEquipe'              , 12                  from dual union all
    select 12      , 'Simon'     , 'CP'                      , 16                  from dual union all
    select 13      , 'Benoit'    , 'CP'                      , 15                  from dual union all
    select 14      , 'Mathieu'   , 'DirecteurProjet'         , 15                  from dual union all
    select 15      , 'Francois'  , 'Manager'                 , 17                  from dual union all
    select 16      , 'Jérome'    , 'Manager'                 , 17                  from dual union all
    select 17      , 'Xavier'    , 'Directeur'               , null                from dual
    )
        SELECT mt.nom,
               substr(      sys_connect_by_path( mt.nom, '/' ),
                      instr(sys_connect_by_path( mt.nom, '/' ), '/', 1, 2) + 1,
                      instr(sys_connect_by_path( mt.nom, '/' ), '/', 1, 3) - instr(sys_connect_by_path( mt.nom, '/' ), '/', 1, 2) - 1) as cp,
               connect_by_root mt.nom as Manager
          FROM MaTable mt
         WHERE mt.libelleType = 'Ingénieur'
    START WITH mt.libelleType = 'Manager'
    CONNECT BY PRIOR mt.id = mt.id_Hierarchie
      ORDER BY mt.id asc;
     
    NOM      CP     MANAGER 
    -------- ------ --------
    Bob      Michel Francois
    Luke     Michel Francois
    Franck   Michel Francois
    Julie    Simon  Jérome  
    Sylvain  Simon  Jérome  
    Rachid   Benoit Francois
    Sophie   Benoit Francois

  5. #5
    Membre chevronné
    Avatar de Manopower
    Inscrit en
    Décembre 2003
    Messages
    516
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 516
    Par défaut
    En effet, de mon coté je n'ai pas trouvé mieux, mais ça ne répond pas au besoin initial puisque CP et Manager peuvent être reliés via un DP ou plus hélas.

    En attendant un miracle, je fais 2 requêtes Ingé > CP et CP > Manager et je boucle dans le code Java.

    Merci pour la tentative Waldar !

  6. #6
    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
    Quitte à faire les deux requêtes, autant faire la jointure dans le SQL :
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    WITH MaTable AS
    (
    SELECT  1 AS id, 'Bob' AS nom, 'Ingénieur' AS libelleType, 10 AS id_Hierarchie FROM dual union ALL
    SELECT  2      , 'Luke'      , 'Ingénieur'               ,  8                  FROM dual union ALL
    SELECT  3      , 'Franck'    , 'Ingénieur'               , 10                  FROM dual union ALL
    SELECT  4      , 'Julie'     , 'Ingénieur'               , 12                  FROM dual union ALL
    SELECT  5      , 'Sylvain'   , 'Ingénieur'               , 11                  FROM dual union ALL
    SELECT  6      , 'Rachid'    , 'Ingénieur'               , 13                  FROM dual union ALL
    SELECT  7      , 'Sophie'    , 'Ingénieur'               , 13                  FROM dual union ALL
    SELECT  8      , 'Suzanne'   , 'IngéSenior'              ,  9                  FROM dual union ALL
    SELECT  9      , 'Fred'      , 'ChefEquipe'              , 10                  FROM dual union ALL
    SELECT 10      , 'Michel'    , 'CP'                      , 15                  FROM dual union ALL
    SELECT 11      , 'Lucie'     , 'ChefEquipe'              , 12                  FROM dual union ALL
    SELECT 12      , 'Simon'     , 'CP'                      , 16                  FROM dual union ALL
    SELECT 13      , 'Benoit'    , 'CP'                      , 15                  FROM dual union ALL
    SELECT 14      , 'Mathieu'   , 'DirecteurProjet'         , 15                  FROM dual union ALL
    SELECT 15      , 'Francois'  , 'Manager'                 , 17                  FROM dual union ALL
    SELECT 16      , 'Jérome'    , 'Manager'                 , 17                  FROM dual union ALL
    SELECT 17      , 'Xavier'    , 'Directeur'               , NULL                FROM dual
    )
      ,  Manager as
    (
        SELECT mt.id, mt.nom,
               connect_by_root mt.nom AS Manager
          FROM MaTable mt
         WHERE mt.libelleType = 'Ingénieur'
    START WITH mt.libelleType = 'Manager'
    CONNECT BY PRIOR mt.id = mt.id_Hierarchie
    )
      ,  CP as
    (
        SELECT mt.id, mt.nom,
               connect_by_root mt.nom AS CP
          FROM MaTable mt
         WHERE mt.libelleType = 'Ingénieur'
    START WITH mt.libelleType = 'CP'
    CONNECT BY PRIOR mt.id = mt.id_Hierarchie
    )
    select m.nom, c.cp, m.manager
      from CP c
           inner join Manager m
             on m.id = c.id
    order by m.id asc;
     
    NOM      CP     MANAGER 
    -------- ------ --------
    Bob      Michel Francois
    Luke     Michel Francois
    Franck   Michel Francois
    Julie    Simon  Jérome  
    Sylvain  Simon  Jérome  
    Rachid   Benoit Francois
    Sophie   Benoit Francois

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Insérer résultat d'une requête : problème de quote
    Par maxime17s dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 05/12/2008, 03h42

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