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 :

Récupérer l'ancètre dans une requête hiérarchique 9i


Sujet :

SQL Oracle

  1. #1
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    237
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

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

    Informations forums :
    Inscription : Août 2002
    Messages : 237
    Points : 185
    Points
    185
    Par défaut Récupérer l'ancètre dans une requête hiérarchique 9i
    Bonjour à tous,

    Je souhaiterai récupérer l'ancètre d'un élément qui se trouve dans un arbre (données hiérarchiques).

    Je suis en 9i et n'ai donc pas toutes les superbes fonctionnalités de la 10g.

    Dois-je travailler avec le sys_connect_by_path et inverser le prior ?

    En vous remerciant d'avance.
    Boutss

  2. #2
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    237
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

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

    Informations forums :
    Inscription : Août 2002
    Messages : 237
    Points : 185
    Points
    185
    Par défaut
    J'ai trouvé ça pour le moment

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select substr(p_id, instr(p_id, '|', -1)+1) from(
    select sys_connect_by_path(id, '|') p_id
    from TLIGNEDECOMPTE LC
    where lc.LIGNEDECOMPTE_ID is null 
    start with id='95034935'
    connect by ID = prior LIGNEDECOMPTE_ID
    )
    Pour un élément donné, 95034935, je récupère son ancètre en parcourant l'arbre en remontant (prior clé étrangère) et ne conserve uniquement que les ancêtres (n'ayant pas de parent).
    Ensuite je travaille sur la chaine que me retourne "connect_by_path" pour pointer sur le dernier séparateur "|" qui contient l'id de l'ancêtre

  3. #3
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    oui, je pense, par exemple

    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
     
    /* sample data */
    with t as (select ename,empno,mgr from emp where ename!='KING')
    /* start of query */
    select 
       ename, 
       max(parent) parent, 
       max(ancestor) keep (dense_rank last order by l) ancestor
    from (
       select ename, prior ename parent,
          nvl(substr(sys_connect_by_path(ename,'/'),2,
             instr(sys_connect_by_path(ename,'/'),'/',2)-2),ename) ancestor,
          level l
       from t
       connect by prior empno=mgr
    )
    group by ename;
    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
     
    ENAME      PARENT     ANCESTOR
    ---------- ---------- -----------
    ADAMS      SCOTT      JONES
    ALLEN      BLAKE      BLAKE
    BLAKE                 BLAKE
    CLARK                 CLARK
    FORD       JONES      JONES
    JAMES      BLAKE      BLAKE
    JONES                 JONES
    MARTIN     BLAKE      BLAKE
    MILLER     CLARK      CLARK
    SCOTT      JONES      JONES
    SMITH      FORD       JONES
    TURNER     BLAKE      BLAKE
    WARD       BLAKE      BLAKE
    bien sûr CONNECT_BY_ROOT serait utile, pense donc à migrer prochainement en 10g (voire 11g)

  4. #4
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    237
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

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

    Informations forums :
    Inscription : Août 2002
    Messages : 237
    Points : 185
    Points
    185
    Par défaut
    Merci encore Laurent,

    Je te passerai un pourcentage de mon salaire

    Alors pour ce qui est de la 10g ou la 11, ça aurait été avec plaisir, mais je ne suis pas du tout en mesure de faire évoluer la BdD.

    J'étudie ta requête.

    Le "with" a t'il une importance ?

    En te remerciant d'avance.
    Boutss

  5. #5
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    237
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

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

    Informations forums :
    Inscription : Août 2002
    Messages : 237
    Points : 185
    Points
    185
    Par défaut
    En fait, en partant de ma proposition, j'arrive à çà :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select id
    from TLIGNEDECOMPTE LC
    where parent is null 
    start with id='1' or ='11'
    connect by ID = prior parent
    On parcourt à partir d'éléments définis vers les parents et grâce à la clause where, on ne récupère que les ancètres reconnaissables par "parent is null".

    Qu'en penses-tu ?

  6. #6
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    oui, c'est aussi possible!

    Pour le pourcentage sur ton salaire, tu peux le mettre de côté pour acheter un livre sur sql ;-)

    http://www.rampant-books.com/book_20...rogramming.htm

    le with n'a pas d'importance, c'est juste pour renseigner la table t

  7. #7
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    237
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

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

    Informations forums :
    Inscription : Août 2002
    Messages : 237
    Points : 185
    Points
    185
    Par défaut
    Il existe en version française...

    Ah je comprends mieux pourquoi tu maitrises autant le sujet !!

Discussions similaires

  1. Comment récupérer les valeurs dans une requête
    Par JeanNoel53 dans le forum JDBC
    Réponses: 23
    Dernier message: 30/04/2015, 20h02
  2. Réponses: 3
    Dernier message: 07/10/2011, 05h44
  3. Réponses: 3
    Dernier message: 29/09/2010, 11h00
  4. [Regex]récupérer la table dans une requête sql
    Par laedit dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 11/09/2009, 16h28
  5. Réponses: 7
    Dernier message: 30/06/2005, 10h06

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