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 :

Problème requête hiérarchique


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Mars 2006
    Messages
    408
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 408
    Par défaut Problème requête hiérarchique
    Bonjour,

    j'ai une table "service" construite de cette façon :
    Id, Id_parent, nom, niveau
    1,0, 'direction', 0
    2,1, 'ss direction 1', 1
    etc...

    j'essaie de faire une requete pour obtenir ceci :

    id, niv_1, niv_2, niv_3 etc....
    1, direction, null, null
    2, direction, ss direction, null
    etc...

    voici la requete qui devrait normalement fonctionner mais je n'ai pas le résultat ci dessus...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    select id, 
             niv0.nom, 
             niv1.nom, 
             niv2.nom
         from ( select * from service where niveau=0) niv0 
    left outer join 
                (select * from service where niveau=1) niv1 on (niv0.id=niv1.id_parent)
    left outer join
                (select * from service where niveau =2) niv2 on (niv1.id=niv2.id_parent)
    et ceci pour autant de niveau de la table service...

    mais je n'ai pas le résultat souhaité...

    Merci pour votre aide.

  2. #2
    Membre Expert
    Femme Profil pro
    Data engineer
    Inscrit en
    Juin 2007
    Messages
    673
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Data engineer
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2007
    Messages : 673
    Par défaut
    Bonjour,
    Les "SELECT * FROM service" ne servent à rien dans le FROM, il suffit de prendre la table service avec un alias différent à chaque fois.
    En inversant le sens des jointures externes on tombe sur un résultat plus proche de celui attendu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT niv0.id, 
             niv0.nom, 
             niv1.nom, 
             niv2.nom
         FROM service niv0 
    LEFT OUTER JOIN service niv1 ON (niv1.id=niv0.id_parent)
    LEFT OUTER JOIN service niv2 ON (niv2.id=niv1.id_parent)

  3. #3
    Membre éclairé
    Inscrit en
    Mars 2006
    Messages
    408
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 408
    Par défaut
    Bonjour,

    Tedo01, merci pour ta réponse. Au départ j'ai utilisé ce type de script (que j'ai trouvé sur le net), mais il ne me retourne pas ce que je veux...
    Exemple, ton script me retournera ceci :

    id, niv0.nom, niv1.nom, niv2.nom
    1, direction, null, null,
    1, direction, ss dir1, null
    1, direction, ss dir1, ss dir2

    ce que je voudrais c'est :
    1, direction, null, null,
    2, direction, ss dir1, null
    3, direction, ss dir1, ss dir2

    J'ai mis à jour mon script, j'y intègre le niveau. J'essaie de "morceler" le script car il ne me retourne pas l'id souhaité...

    Merci

  4. #4
    Membre Expert
    Femme Profil pro
    Data engineer
    Inscrit en
    Juin 2007
    Messages
    673
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Data engineer
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2007
    Messages : 673
    Par défaut
    Bonjour,
    Le problème, c'est que dans le résultat attendu l'id ne correspond pas toujours au même niveau.
    Ce que je ferais pour représenter tous les niveaux possibles, c'est l'union de requêtes, chacune sur un niveau :
    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
    WITH service AS
    (
          SELECT 1 id, null id_parent, 'direction' nom, 1 niveau FROM dual
    UNION SELECT 2,    1,              'ss-dir1'      , 2        FROM dual
    UNION SELECT 3,    1,              'ss-dir2'      , 2        FROM dual
    UNION SELECT 4,    2,              'ss-dir3'      , 3        FROM dual
    UNION SELECT 5,    2,              'ss-dir4'      , 3        FROM dual
     
    )
    SELECT niv3.id, 
           niv3.niveau,
           niv1.nom, 
           niv2.nom, 
           niv3.nom
               FROM service niv3 
    LEFT OUTER JOIN service niv2 ON (niv2.id=niv3.id_parent)
    LEFT OUTER JOIN service niv1 ON (niv1.id=niv2.id_parent)
    WHERE niv3.niveau = 3
    UNION
    SELECT niv2.id, 
           niv2.niveau,
           niv1.nom, 
           niv2.nom, 
           NULL
               FROM service niv2 
    LEFT OUTER JOIN service niv1 ON (niv1.id=niv2.id_parent)
    WHERE niv2.niveau = 2
    UNION
    SELECT niv1.id, 
           niv1.niveau,
           niv1.nom, 
           NULL, 
           NULL
    FROM service niv1 
    WHERE niv1.niveau = 1

  5. #5
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Utilisez sys_connect_by_path
    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
     
    Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 
    Connected as mni
     
    SQL> 
    SQL> WITH service AS
      2  (
      3        SELECT 1 id, NULL id_parent, 'direction' nom, 1 niveau FROM dual
      4  UNION SELECT 2,    1,              'ss-dir1'      , 2        FROM dual
      5  UNION SELECT 3,    1,              'ss-dir2'      , 2        FROM dual
      6  UNION SELECT 4,    2,              'ss-dir3'      , 3        FROM dual
      7  UNION SELECT 5,    2,              'ss-dir4'      , 3        FROM dual
      8  )
      9  Select id, nom, sys_connect_by_path(nom,'/') As text
     10    from service
     11   connect by prior id = id_parent
     12   start with id_parent Is Null
     13  /
     
            ID NOM       TEXT
    ---------- --------- --------------------------------------------------------------------------------
             1 direction /direction
             2 ss-dir1   /direction/ss-dir1
             4 ss-dir3   /direction/ss-dir1/ss-dir3
             5 ss-dir4   /direction/ss-dir1/ss-dir4
             3 ss-dir2   /direction/ss-dir2
     
    SQL>

  6. #6
    Membre éclairé
    Inscrit en
    Mars 2006
    Messages
    408
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 408
    Par défaut
    Bonjour à tous,

    Merci pour vos réponse, mais cela ne fonctionne pas...
    par exemple pour le niveau 1=> j'ai un mix du niveau 2 et niveau 1... alors que je prends bien en compte le nombre de niveau lorsque je fais mon self join...
    De plus, le ne fonctionne pas chez moi (sous sqldeveloper)...

    Merci pour votre aide!

Discussions similaires

  1. Problème avec requête hiérarchique
    Par moezsokrati dans le forum SQL
    Réponses: 1
    Dernier message: 27/08/2008, 16h33
  2. erreur3073 Problème requête
    Par amel123456789 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 01/04/2004, 10h15
  3. Problème requête qui renvoie plusieurs
    Par dai.kaioh dans le forum Langage SQL
    Réponses: 6
    Dernier message: 01/04/2004, 10h07
  4. Problème requête avec UNION et ORDER BY
    Par Yann21 dans le forum Langage SQL
    Réponses: 12
    Dernier message: 12/12/2003, 11h02
  5. Réponses: 8
    Dernier message: 23/10/2003, 16h22

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