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 :

Auto-jointure, table sous forme d'arbre


Sujet :

SQL Oracle

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Auto-jointure, table sous forme d'arbre
    Bonjour, je me retrouve devant un petit problème, j'ai devant moi une table personne qui est une sorte d'arbre généalogique ayant pour attributs numéro (id), le nom, le prénom, les dates de naissance et de décès, le sexe, le pere qui est de type personne, et la mere qui est de type personne aussi. On me demande donc à travers l'utilisation d'auto jointures et de vues, de rechercher les ascendants d'une personne donnée (on lui donnera le numéro x). Je vous demande donc si possible une requête me permettant d'avancer.

  2. #2
    Membre à l'essai
    Homme Profil pro
    DBA
    Inscrit en
    Janvier 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : DBA
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2014
    Messages : 11
    Points : 13
    Points
    13
    Par défaut
    Bonjour,

    Pour que les gens te répondent, essaye de donner la structure de ta table et dire sous quel SGBDR tu veux résoudre ton problème.
    Sur Sql server une requête récursive doit solutionner ton problème.

    Développement Votre.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Bonjour, merci de ta réponse, et en effet j'ai oublié de précisé ces choses :
    Je travaille sur sql plus avec oracle 12c, et voila la structure de la table personnes :
    Nom NULL ? Type
    ---------------------------------------------------- -------- ------------------------------------
    NUMERO NOT NULL NUMBER(7)
    NOM VARCHAR2(15)
    PRENOM VARCHAR2(15)
    DATENAISSANCE VARCHAR2(20)
    DATEMORT VARCHAR2(20)
    SEXE CHAR(1)
    PERE NUMBER(7)
    MERE NUMBER(7)

    Avec des clés étrangères sur les attributs pere et mere référençant la table personne elle même.

    Aussi, je ne vois pas vraiment à quoi ressemble une requête récursive, pourrais-tu m'en dire plus ?

    Merci !

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut Il faut préciser le besoin
    bonjour

    Faut il, pour une personne, restituer les noms et prénoms du père et de la mère, ou bien, pour cette même personne, restituer les noms et prénoms des parents, grands-parents etc... sur plusieurs générations

    Dans le premier cas, une double auto-jointure suffit
    Dans le deuxième, il faut effectivement construire une requête récursive basée sur une "Common Table Expression (CTE)", en précisant la profondeur de la recherche c'est à dire le nombre de générations à rechercher.

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Salut et merci de ta réponse, je suis plutôt sur le 2ème cas, il me faut afficher les infos des parents des grand parents etc du nœud donné, et par contre il est bien spécifié que je dois le faire d'abord "en utilisant les auto-jointures et les vues", ensuite le faire d'une autre manière "en utilisant les clauses de récursivité Oracle".

    Alors pour la partie clause de récursivité, j'ai déjà une petite idée et ce n'est pas vraiment mon problème, ce qui m'embête c'est la première méthode demandée, où il ne faut donc pas utiliser de clause de récursivité.

    Merci !

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    par contre il est bien spécifié que je dois le faire d'abord "en utilisant les auto-jointures et les vues", ensuite le faire d'une autre manière "en utilisant les clauses de récursivité Oracle".
    Je crois comprendre qu'il s'agit d'un exercice ?

    Tu diras de ma part à ton prof que stocker une date dans une colonne de type VARCHAR2, c'est mal ! En plus un VARCHAR2(20) alors qu'une date s'écrit avec 10 caractères (2018-10-20) !
    Et que 15 caractères pour un nom, ce n'est pas beaucoup ! Une camarade de classe au collège s'appelait Dubuisson-Duplessis (19 lettres).
    Et qu'un numéro de type NUMBER, qui est un nombre décimal, ce n'est pas top non plus ! Un INTEGER serait plus approprié.

    Pour ta question, je suppose qu'on doit te demander de faire une vue pour trouver les parents. Ensuite, tu peux utiliser cette vue pour trouver les parents des parents donc les grands parents...
    Et je suppose qu'on te fait faire ça pour te montrer l'utilité des CTE qui sont plus simples à utiliser pour la récursivité.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Salut et merci de ta réponse, alors crois moi je me suis fait les mêmes réflexions que toi en ragrdant la structure de la table hahaha !

    Sinon tu veux donc dire que j'utilise plusieurs requêtes pour arriver au résultat ?

    Merci !

  8. #8
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Commence par faire la vue qui donne les parents.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Salut et merci à tous, au final j'ai fini par créer des vues qui portent sur chaque génération, en gros si je prend comme exemple un nœud x je vais créer une vue pour les parents directs de ce noeud, ensuite une autre vue pour les parents des parents et ainsi de suite jusqu’à ce qu'il n'y ai plus d'ascendants. Je ne sais pas trop si c'est ce qui est attendu mais bon je vois pas d'autres manières de le faire.

  10. #10
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Clause "Connect by" oracle
    Désolé du double post, mais je suis maintenant face à un autre problème, en gros dans la partie ou il faut utiliser les clauses de récursivité oracle pour avoir la liste des ascendants, je n'arrive à avoir comme résultat les ascendants des deux sexes, en gros la requête à exécuter doit ressembler à quelque-chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select * from personnes start with numero=1 connect by prior pere=numero; 
                                                                                          ou mere=numero;
    Voila du coup mon problème c'est que si j'utilise ça comme requête j'aurais pour le pere : le pere, le pere du pere, le pere du pere du pere, etc... Idem pour la mere

    Alors que je voudrais avoir les deux en même temps. J'ai essayé d'intégrer un connecteur OR un peu partout dans la requête mais rien à faire.

    Si quelqu'un a une idée pour m'éclairer !

    Merci !

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

Discussions similaires

  1. Jointure dans une troiseme table sous forme de template
    Par tamtam64 dans le forum Requêtes et SQL.
    Réponses: 0
    Dernier message: 28/08/2015, 16h38
  2. afficher les données d'une table sous forme d'une arbre
    Par combe_6 dans le forum Servlets/JSP
    Réponses: 0
    Dernier message: 30/07/2014, 12h55
  3. Récupérer le chemin d'une table sous forme d'arbre
    Par ForgetTheNorm dans le forum SQL Procédural
    Réponses: 9
    Dernier message: 25/07/2012, 16h09
  4. Exporter le contenu d'une table sous forme d'un script SQL
    Par Invité dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 14/09/2005, 10h08
  5. créer une arborescence windows sous forme d'arbre java
    Par chupachoc dans le forum Composants
    Réponses: 3
    Dernier message: 01/10/2002, 16h48

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