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 :

connect by prior


Sujet :

SQL Oracle

  1. #1
    Membre averti
    Homme Profil pro
    etudiant
    Inscrit en
    Mai 2019
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : etudiant

    Informations forums :
    Inscription : Mai 2019
    Messages : 22
    Par défaut connect by prior
    Bonjour,

    voici la table suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TABLE articles(
           categorie VARCHAR2(30),
          categorie_sup VARCHAR2(30)
        );
    je ne comprends pas ce que le connect by prior fait dans la syntaxe suivante , le start with je l ai compris.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT lpad(' ',2*level)||categorie as "ARTICLES"
       FROM articles
      3  CONNECT BY PRIOR categorie=categorie_sup
      4  START WITH categorie = 'articles'
      5  ;
    merci

  2. #2
    Membre Expert
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    2 005
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 2 005

  3. #3
    Membre averti
    Homme Profil pro
    etudiant
    Inscrit en
    Mai 2019
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : etudiant

    Informations forums :
    Inscription : Mai 2019
    Messages : 22
    Par défaut
    merci pour la réponse

    mais je ne l'ai pas compris malgré que j'avais deja visité la page du lien que vous avez fourni

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

    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
    Billets dans le blog
    4
    Par défaut
    Le prior définit la hiérarchie. Les parents sont categorie et les enfants sont categorie_sup

  5. #5
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 942
    Par défaut
    Bonjour,

    Vu que la réponse de McM n'est toujours pas validée par un +1 ou une clôture de discussion, je me lance à mon tour dans les explications.

    1ere étape : comprendre la source des données :
    En exécutant cette requête simpliste, on trouve les 2 colonnes utiles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT categorie, categorie_sup
       FROM articles
       ORDER BY categorie ;
    2ieme étape : décrire l'algo de résolution
    La question est simple : en partant de la ligne categorie='articles' :
    1- quelles sont les lignes utiles ?
    2- comment fait-on pour les trouver ?

    Formalise les réponses par écrit.
    Relis la requête en cause.

    Si la solution ne t'apparait pas, poste les 3 réponses et on pourra poursuivre ensemble

  6. #6
    Membre très actif
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 260
    Par défaut
    Bonjour,

    Peut-être que voir le fonctionnement Oracle écrit en SQL d'un autre SGBD (sql server) pour vous aider à visualiser le traitement qui est fait dans un connect by...

    https://social.msdn.microsoft.com/Fo...=sqlgetstarted


    Bisous

  7. #7
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 200
    Par défaut
    Je vais aborder la même question, sous un angle différent.
    J'ai une table avec 4 colonnes :
    - Identifiant _individu (un n° de Sécu , ou un truc comme ça)
    - nom_prénom_individu
    - identifiant_pere (le n° de Sécu du père)
    - identifiant_mere (le n° de Sécu de la mère)

    On imagine bien qu'avec cette table, en remontant de fil en aiguille, à partir d'un individu, on va savoir retrouver son père, son grand-père paternel, et idem, en prenant à chaque fois le père de de l'individu précédent.
    Idem, mais avec la mère, la grand-mère maternelle , etc etc.

    Et c'est suivant ce qu'on va mettre dans cette instruction 'Connect by prior' qu'on va parcourir une branche, ou bien l'autre branche.

  8. #8
    Membre averti
    Homme Profil pro
    etudiant
    Inscrit en
    Mai 2019
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : etudiant

    Informations forums :
    Inscription : Mai 2019
    Messages : 22
    Par défaut
    bonsoir ,
    merci pour vos réponses


    si je comprends bien :

    le connect by ca sera ma racine de depart

    et le prior ds quel sens lire l'arbre des feuilles ou de la racine

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CONNECT BY PRIOR categorie=categorie_sup
      START WITH categorie = 'articles'
    ici cela veut dire que je vais commencer par l article_sup et partir vers les articles qui seront ou pas articles_sup d autres articles , jusque la dernière branche
    ensuite recommencer ....

  9. #9
    McM
    McM est déconnecté
    Expert confirmé

    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
    Billets dans le blog
    4
    Par défaut
    le connect by start with ca sera ma racine de depart
    et le prior ds quel sens lire l'arbre des feuilles ou de la racine

  10. #10
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 942
    Par défaut
    Bonsoir,
    Citation Envoyé par azzimu Voir le message
    ici cela veut dire que je vais commencer par l article_sup et partir vers les articles qui seront ou pas articles_sup d autres articles , jusque la dernière branche
    ensuite recommencer ....
    En fait tu n'as simplement pas suivi le protocole que je t'avais indiqué.
    En ayant fait les étapes à la "main" tu aurais vu la mécanique.

    Un de problèmes du parcours de l'arbre est la clause de jointure (ici categorie=categorie_sup)
    Or, en pure logique si a=b alors b=a
    Ce qui ne nous dit rien du "sens" que l'on veut donner dans le parcours de l'arbre ; veut-on le "monter" ou le "descendre" ; on part de la valeur trouvée dans la colonne categorie pour trouver la/les lignes dont la valeur correspondante se trouve dans la colonne categorie_sup, ou l'inverse ?
    La réponse à cette problématique est dans l'usage de PRIOR

    Et puis, comme te l'a fait remarquer McM, la clause start with n'a pas de sens caché sinon une traduction via deepl.com pourra t'aider.

  11. #11
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 200
    Par défaut
    En fait, le diable est dans les détails. Quand on lit la requete à voix haute, il faut mettre les espaces au bon endroit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CONNECT BY PRIOR      categorie=categorie_sup                     -- NON
      START WITH categorie = 'articles'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CONNECT BY       PRIOR categorie       =categorie_sup      --OUI
      START WITH categorie = 'articles'
    Et en fait on peut même écrire la commande de façon un peu différente (si a=b, alors b=a, ça s'applique ici) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CONNECT BY categorie_sup = PRIOR categorie             
      START WITH categorie = 'articles'
    On Commence par les lignes qui vérifient categorie = 'articles'
    Püis on connecte les autre lignes, avec la relation : categorie_sup = PRIOR categorie , c'est à dire : categorie_sup de l'enregistrement en cours = Categorie de l'enregistrement précédent.

  12. #12
    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
    Et pour la petite histoire, vous pouvez aussi mettre PRIOR categorie dans le SELECT, c'est valide lors d'une requête récursive.
    En reprenant votre table :
    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
    insert into articles values ('articles', 'articles_sup');
    insert into articles values ('articles_top', 'articles');
    commit;
     
        select level
             , categorie
             , categorie_sup
             , prior categorie
             , prior categorie_sup
          from articles
    start with categorie     = 'articles'
    connect by categorie_sup = prior categorie;
     
    LEVEL  CATEGORIE     CATEGORIE_SUP  PRIORCATEGORIE  PRIORCATEGORIE_SUP
    -----  ------------  -------------  --------------  ------------------
        1  articles      articles_sup
        2  articles_top  articles       articles        articles_sup

Discussions similaires

  1. CONNECT BY PRIOR oracle pour MySQL : possible ?
    Par thanaos dans le forum Requêtes
    Réponses: 1
    Dernier message: 12/12/2006, 15h11
  2. Connect By Prior ?
    Par eric95 dans le forum Hibernate
    Réponses: 2
    Dernier message: 05/12/2006, 09h52
  3. Réponses: 6
    Dernier message: 10/05/2006, 15h34
  4. [SQLSERVER] Connect by prior sous SQL Server
    Par marsup54 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 02/03/2006, 09h49
  5. quel équivalent de start with...connect by prior en DB?
    Par Mittou dans le forum Langage SQL
    Réponses: 5
    Dernier message: 18/10/2005, 14h02

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