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 :

Requete hiérarchisée ORACLE


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Homme Profil pro
    OCTAL - ORACLE
    Inscrit en
    Février 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : OCTAL - ORACLE
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2008
    Messages : 25
    Points : 24
    Points
    24
    Par défaut Requete hiérarchisée ORACLE
    Bonjour,

    J'ai un problème pour déterminer le père racine d’un composant :
    Je vais vous donner un exemple pour expliquer mon problème.
    J’ai une table NOMENCLATURE qui contient le code du COMPOSE et le CODE de COMPOSANT (un COMPOSE peut être un COMPOSANT d’un autre COMPOSE) :

    composé1--> composé2 --> composant02
    --> composant01.

    Je veux déterminer le père racine du composant « COMPOSANT02 » qui serai « Composé1 ».
    La requête ci-dessous me donne les deux pères « Composé1 » et « Composé2 ».
    Mais mon besoin est de déterminer que le père racine « Composé1 ». Comment je peux le faire. Merci.

    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
    SELECT nome_arti_code_compose,
          Lpad(' ',(level-1)*2)||nome_arti_code_compose v_compose_decale,
          nome_ligne,
          nome_arti_code_composant,
          nome_coefficient,
          nome_indice,
          level,
          nome_debut_validite,
          nome_fin_validite
     
    FROM  nomenclature
    WHERE nome_debut_validite <= trunc(sysdate)
    AND   NVL(nome_fin_validite, trunc(sysdate) ) >= trunc(sysdate)
    START WITH nome_arti_code_composant = :composant
    CONNECT BY
            PRIOR nome_arti_code_compose = nome_arti_code_composant
    AND PRIOR nome_debut_validite   <= trunc(sysdate)
    AND NVL(PRIOR nome_fin_validite, trunc(sysdate)) >= trunc(sysdate)

  2. #2
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Avec SYS_CONNECT_BY_PATH, tu peux récupérer le chemin, donc récupérer le premier Composant.

  3. #3
    Membre à l'essai
    Homme Profil pro
    OCTAL - ORACLE
    Inscrit en
    Février 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : OCTAL - ORACLE
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2008
    Messages : 25
    Points : 24
    Points
    24
    Par défaut Pour Mr McM
    j'ai mis sys_CONNECT_BY_PATH à la place de CONNECT BY

    il m'affiche l'erreur suivante: ORA-01788: une clause CONNECT BY est obligatoire dans ce bloc d'interrogation.

    à titre dinformation j'utilise ORACLE 9i.

  4. #4
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    mais c'est une fonction !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sys_CONNECT_BY_PATH(champ, séparateur)

  5. #5
    Membre à l'essai
    Homme Profil pro
    OCTAL - ORACLE
    Inscrit en
    Février 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : OCTAL - ORACLE
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2008
    Messages : 25
    Points : 24
    Points
    24
    Par défaut
    j'ai testé ce code
    SELECT sys_connect_by_path (nome_arti_code_compose,'|')
    mais il m'a pas donné les résultats shoutés:
    il me rend juste le père direct et non pas le père racine.

    composé1 --> composé1.1 --> composant01

    il me rend composant01|composé1.1

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 388
    Points
    18 388
    Par défaut
    La fonction renvoie toute la chaîne de filiation pour être précis.

    Afin de trouver le père racine, il suffit de faire une sous-chaîne de ce résultat jusqu'au premier séparateur, donc combiner les fonctions sys_connect_by_path, substr et instr !

  7. #7
    Membre à l'essai
    Homme Profil pro
    OCTAL - ORACLE
    Inscrit en
    Février 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : OCTAL - ORACLE
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2008
    Messages : 25
    Points : 24
    Points
    24
    Par défaut @waldar
    la fonction rend composant01||composé1.1
    si elle rend composant01||composé1.1||composé1, dans ce cas je peux extraire le pere racine, j'aimerai avoir une solution pour qu'elle me rend composant01||composé1.1||composé1

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Vous pouvez essayer :
    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
    SELECT nome_arti_code_compose,
          Lpad(' ',(level-1)*2)||nome_arti_code_compose v_compose_decale,
          nome_ligne,
          nome_arti_code_composant,
          nome_coefficient,
          nome_indice,
          level,
          nome_debut_validite,
          nome_fin_validite
      FROM  nomenclature TNOM
    WHERE nome_debut_validite <= trunc(sysdate)
    AND   NVL(nome_fin_validite, trunc(sysdate) ) >= trunc(sysdate)
    and not exists
     (
    SELECT  'x'
     FROM  nomenclature
    WHERE nome_debut_validite <= trunc(sysdate)
    AND   NVL(nome_fin_validite, trunc(sysdate) ) >= trunc(sysdate)
    START WITH nome_arti_code_compose =  TNOM.nome_arti_code_compose 
    CONNECT BY
            PRIOR nome_arti_code_compose = nome_arti_code_composant
    AND PRIOR nome_debut_validite   <= trunc(sysdate)
    AND NVL(PRIOR nome_fin_validite, trunc(sysdate)) >= trunc(sysdate)
    )
    START WITH nome_arti_code_composant = :composant
    CONNECT BY
            PRIOR nome_arti_code_compose = nome_arti_code_composant
    AND PRIOR nome_debut_validite   <= trunc(sysdate)
    AND NVL(PRIOR nome_fin_validite, trunc(sysdate)) >= trunc(sysdate)

  9. #9
    Membre à l'essai
    Homme Profil pro
    OCTAL - ORACLE
    Inscrit en
    Février 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : OCTAL - ORACLE
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2008
    Messages : 25
    Points : 24
    Points
    24
    Par défaut @rabah
    Merci ça marché, j'ai testé avant avec not exists mais sans connect by.
    Merci une autre fois.

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

Discussions similaires

  1. [PRO*C] Langage c et requete base oracle
    Par manucha dans le forum Interfaces de programmation
    Réponses: 7
    Dernier message: 15/06/2007, 14h11
  2. Langage c et requete base oracle
    Par manucha dans le forum Oracle
    Réponses: 2
    Dernier message: 16/02/2007, 11h13
  3. DIVISION dans une requete sql ORACLE
    Par medonline dans le forum Langage SQL
    Réponses: 11
    Dernier message: 31/01/2007, 12h51
  4. Sous-requetes SQL Oracle MsQUERY
    Par CHRISTOPHE_86 dans le forum Oracle
    Réponses: 1
    Dernier message: 11/09/2006, 20h45
  5. Requete SQL Oracle
    Par Nounoursonne dans le forum Langage SQL
    Réponses: 3
    Dernier message: 19/07/2006, 11h48

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