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 :

[oracle9i] Requête hiérarchique


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Par défaut [oracle9i] Requête hiérarchique
    Bonjour.

    Parmi les nombreux posts sur les requêtes hiérarchiques, je n'ai pas trouvé un cas similaire au mien. En effet, j'ai une table contenant toutes les relations entre un père et tous ses descendants, y compris lui-même.
    Et j'aimerais afficher une arborescence classique.

    Prenons cet arbre pour exemple (l'arbre que j'aimerais afficher):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    A
    --A1
    ----A11
    ------A111
    ------A112
    ----A12
    ----A13
    --A2
    ----A21
    ----A22
    ------A221
    Voici ce que j'ai en base pour le schéma ci-dessus:
    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
    WITH t AS (
              SELECT 'A' PARENT, 'A' enfant FROM dual
    UNION ALL SELECT 'A' PARENT, 'A1' enfant FROM dual
    UNION ALL SELECT 'A' PARENT, 'A2' enfant FROM dual
    UNION ALL SELECT 'A' PARENT, 'A11' enfant FROM dual
    UNION ALL SELECT 'A' PARENT, 'A12' enfant FROM dual
    UNION ALL SELECT 'A' PARENT, 'A13' enfant FROM dual
    UNION ALL SELECT 'A' PARENT, 'A21' enfant FROM dual
    UNION ALL SELECT 'A' PARENT, 'A22' enfant FROM dual
    UNION ALL SELECT 'A' PARENT, 'A111' enfant FROM dual
    UNION ALL SELECT 'A' PARENT, 'A112' enfant FROM dual
    UNION ALL SELECT 'A' PARENT, 'A221' enfant FROM dual
    UNION ALL SELECT 'A1' PARENT, 'A1' enfant FROM dual
    UNION ALL SELECT 'A1' PARENT, 'A11' enfant FROM dual
    UNION ALL SELECT 'A1' PARENT, 'A12' enfant FROM dual
    UNION ALL SELECT 'A1' PARENT, 'A13' enfant FROM dual
    UNION ALL SELECT 'A1' PARENT, 'A111' enfant FROM dual
    UNION ALL SELECT 'A1' PARENT, 'A112' enfant FROM dual
    UNION ALL SELECT 'A2' PARENT, 'A2' enfant FROM dual
    UNION ALL SELECT 'A2' PARENT, 'A21' enfant FROM dual
    UNION ALL SELECT 'A2' PARENT, 'A22' enfant FROM dual
    UNION ALL SELECT 'A2' PARENT, 'A221' enfant FROM dual
    UNION ALL SELECT 'A11' PARENT, 'A11' enfant FROM dual
    UNION ALL SELECT 'A11' PARENT, 'A111' enfant FROM dual
    UNION ALL SELECT 'A11' PARENT, 'A112' enfant FROM dual
    UNION ALL SELECT 'A12' PARENT, 'A12' enfant FROM dual
    UNION ALL SELECT 'A13' PARENT, 'A13' enfant FROM dual
    UNION ALL SELECT 'A21' PARENT, 'A21' enfant FROM dual
    UNION ALL SELECT 'A22' PARENT, 'A22' enfant FROM dual
    UNION ALL SELECT 'A22' PARENT, 'A221' enfant FROM dual
    UNION ALL SELECT 'A111' PARENT, 'A111' enfant FROM dual
    UNION ALL SELECT 'A112' PARENT, 'A112' enfant FROM dual
    UNION ALL SELECT 'A221' PARENT, 'A221' enfant FROM dual
    )
    J'ai bien essayé avec un connect by prior et un SYS_CONNECT_BY_PATH mais il y a toujours un truc qui coince.

    Merci pour votre aide.

  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
    Qu'est-ce qui ne convient pas avec la boucle standard ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select lpad('-', 2*(level-1), '-') || enfant as resultat
    from t
    start with parent = enfant
    connect by nocycle prior enfant = parent

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Par défaut
    Ce qui ne va pas, c'est que... je ne suis pas en 10 g mais en 9i.

    Du coup, le NOCYCLE ne passe pas, et si je l'enlève, j'ai l'erreur "boucle CONNECT BY dans les données utilisateur" (erreur que j'ai avec ma requête, proche de la vôtre).

  4. #4
    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
    Peut être que tu pourrais éviter le nocycle en transformant les données sur le modelé de la table emp : à la place du parent = enfant, parent is null et utilisation d’un inline view et un case
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT lpad('-', 2*(level-1), '-') || enfant AS resultat
    FROM (Select Case when parent = enfant then null else parent end parent, enfant from t)
    connect BY prior enfant = parent
    start WITH parent is null

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Par défaut
    On y est presque.
    Votre requête m'affiche l'arborescence de A (lignes 1 à 25 du résultat), mais aussi celle de A1 (26-33), A2 (34-38), A11...... jusqu'à A221. Toutes les arborescences des fils, même sans descendants.
    Seules les 25 premières lignes - descendance de A - m'intéressent.

  6. #6
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Salut !

    Prends le level max pour chaque enfant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    , u AS (
    SELECT level as l, enfant, lpad('-', 2*(level-1), '-') || enfant AS resultat
    FROM (SELECT Case when parent = enfant then NULL else parent end parent, enfant FROM t)
    connect BY prior enfant = parent
    start WITH parent IS NULL
    )
    , v as(
    SELECT resultat, row_number() over(partition by enfant order by l desc) rk
    from u)
    select * 
    from v 
    where rk = 1

Discussions similaires

  1. Réponses: 6
    Dernier message: 27/06/2007, 11h11
  2. Est-il possible de faire une requête hiérarchique ?
    Par Christophe Charron dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 21/03/2007, 14h32
  3. Réponses: 1
    Dernier message: 14/02/2007, 15h51
  4. requête hiérarchique et mysql4
    Par kitty2006 dans le forum Requêtes
    Réponses: 2
    Dernier message: 26/08/2006, 08h36
  5. Requête "hiérarchique"
    Par alxfg dans le forum Langage SQL
    Réponses: 7
    Dernier message: 09/02/2006, 02h27

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