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

Langage SQL Discussion :

Requête liée à plusieurs tables


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Octobre 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 80
    Points : 58
    Points
    58
    Par défaut Requête liée à plusieurs tables
    Bonjour à tous,

    Je ne connais pratiquement pas le SQL, je suis un débutant complet. Je vous soumets mon problème car après quelques essais infructueux, je craque.

    Voici tout d'abord le format simplifié de mes tables :
    T_INDIVIDU possède entre autres les colonnes i_id, i_name, i_surname
    T_EVENT possède entre autres les colonnes d_gid (= i_id), d_year, d_fact (type d'évènement, DEAT pour décès, BIRT pour naissance)

    J'aimerais lancer une requête pour disposer de 5 colonnes i_id, i_name, i_surname, i_yearb (année de naissance), i_yeard (année de décès).

    J'ai commencé par créer deux vues pour avoir la liste des années de décès et de naissance (c'est une base de généalogie). Il n'y a pas forcément d'évènements associés à un individu.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CREATE VIEW NAISSANCE (i_id, i_yearb) AS SELECT d_gid, d_year FROM T_DATE WHERE d_fact = 'BIRT';
    CREATE VIEW DECES (i_id, i_yeard) AS SELECT d_gid, d_year FROM T_EVENT WHERE d_fact = 'DEAT';
    Ensuite, c'est là que je coince. Je n'arrive pas à faire une UNION correcte entre les tables pour avoir tous mes individus. Je ne sais pas comment faire pour avoir les individus qui n'ont pas d'évènements associés.

    Nul doute que c'est un exercice très facile pour un 'geek' du SQL, j'attends donc vos très nombreuses réponses Merci pour votre attention.

    Cordialement,
    Jean-Pierre

  2. #2
    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 : 61
    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 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Si tous les débutants en SQL savaient , comme vous, créer des vues, nommer correctement leurs colonnes et exposer aussi bien leur problème, ce serait un bonheur de les aider et SQLPro s'énerverait moins !

    La solution à votre problème s'appelle Jointure. Et comme vous voulez tous les individus, même s'ils n'ont pas d'événement associé, il faut une jointure externe.

    Je vous laisse les découvrir. Revenez nous voir si vous n'y arrivez pas.

  3. #3
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 152
    Points : 1 414
    Points
    1 414
    Par défaut
    Bonjour


    et pourquoi ne pas commencer par lire les cours qui existe sur Develeppez.com ? J'ai un faible pour ceux de SQLPro

    Et ensuite, si la difficulté demeure, faire appel au forum (après avoir lu ces règles de fonctionnement)
    merci

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Octobre 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 80
    Points : 58
    Points
    58
    Par défaut
    Merci à vous deux pour vos réponses.
    Citation Envoyé par CinePhil Voir le message
    Si tous les débutants en SQL savaient , comme vous, créer des vues, nommer correctement leurs colonnes et exposer aussi bien leur problème, ce serait un bonheur de les aider et SQLPro s'énerverait moins !
    J'ai quand même un peu lu avant de poster mon message . Je viens de découvrir Androïd (grâce à mon téléphone) et du coup je me suis mis à Java mais en ayant la maitrise du C, C++ (que j'utilise pour mon métier de tous les jours), ce n'est pas trop compliqué . La première application que je veux réaliser est une petite application qui me permettra de récupérer des données sur mon site de Généalogie (Technologie PHP-MySQL).
    Citation Envoyé par dehorter olivier Voir le message
    et pourquoi ne pas commencer par lire les cours qui existe sur Develeppez.com ? J'ai un faible pour ceux de SQLPro
    Pour le cours, je vais y jeter un oeil, mais ma méthode d'apprentissage est plutôt le plongeon direct dans la réalisation, c'est comme cela que je mémorise le mieux. Je me fixe un but et après l'analyse et la définition du besoin, je me lance dans la réalisation en effectuant des recherches par rapport aux étapes qui me posent problème. Suivre un cours de A à Z n'a jamais été mon fort
    Citation Envoyé par CinePhil Voir le message
    La solution à votre problème s'appelle Jointure. Et comme vous voulez tous les individus, même s'ils n'ont pas d'événement associé, il faut une jointure externe.
    Je vais suivre de ce pas la piste des jointures externes (avec JOIN je suppose). J'avais brièvement essayé dans ce sens mais j'ai ensuite pensé que l'UNION était plus approprié à mon problème. Donc, je repars sur le JOIN

    Cordialement,
    Jean-Pierre

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Octobre 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 80
    Points : 58
    Points
    58
    Par défaut
    C'est encore moi !

    Ca y est, j'ai le résultat désiré en lisant la partie sur les jointures externes de SQLPro . Voici mes requêtes :
    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
    DROP VIEW IF EXISTS NAISSANCE;
     
    CREATE VIEW NAISSANCE (n_id, n_year) AS SELECT d_gid, d_year FROM T_EVENT WHERE d_fact = 'BIRT';
     
    DROP VIEW IF EXISTS DECES;
     
    CREATE VIEW DECES (d_id, d_year) AS SELECT d_gid, d_year FROM T_EVENT WHERE d_fact = 'DEAT';
     
    SELECT i_id, i_name, i_surname, n_year, d_year
    FROM  T_INDIVIDU IND
           LEFT OUTER JOIN NAISSANCE N
                ON IND.i_id = N.n_id
           LEFT OUTER JOIN DECES D
                ON IND.i_id = D.d_id
    WHERE i_surname like '%FROMENT%';  # Pour avoir uniquement certains patronymes
    et les questions subsidiaires :
    - A propos des vues, y'a-t-il un inconvénient à les laisser dans la base de données, une fois créé ? Est-elle créée avec l'instantanné de la base au moment de la création de la vue ou est-elle mise à jour en même temps que les autres tables ? Comme vous le voyez, je l'efface avant de la recréer. Je ne pense pas que ce soit la méthode idéale.
    - Suis-je obligé de passer par ces vues ou puis-je tout intégrer dans une requête SELECT ? Y'a-t-il un avantage/inconvénient à l'une ou l'autre de ces méthodes.

    Merci encore pour votre patience.

    Cordialement,
    Jean-Pierre

  6. #6
    Membre expert

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2012
    Messages
    612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Juin 2012
    Messages : 612
    Points : 3 066
    Points
    3 066
    Par défaut
    Bonjour,

    Pour faire simple, une vue est une table virtuelle résultant d'une requête. À chaque interrogation de la vue, la requête est réexécutée, les données obtenus sont donc à jour
    Il est donc évidemment inutile de les supprimer pour les recréer.

    J'approuve CinePhil, si tous les débutants étaient comme vous ce serait vraiment la belle vie

    Bonne continuation

  7. #7
    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 : 61
    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 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Pour faire simple, une vue est une table virtuelle résultant d'une requête.
    Je dirais plutôt qu'une vue est une requête enregistrée.

    En interrogeant la vue, le SGBD exécute effectivement la requête avec l'état des données au moment de l'interrogation, pas au moment de l'enregistrement de la requête. Ce n'est donc pas du tout une table, même virtuelle.

  8. #8
    Membre expert

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2012
    Messages
    612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Juin 2012
    Messages : 612
    Points : 3 066
    Points
    3 066
    Par défaut
    On peut le voir comme une table virtuelle dans le sens où on peut l'interroger comme une table (parfois même effectuer des modifications dans des cas limités).
    J'essayais de faire une définition simple pour Procyon, mais effectivement votre explication est plus claire

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

Discussions similaires

  1. [1.x] Flux RSS + requête entre plusieurs tables liées
    Par blasil64 dans le forum Symfony
    Réponses: 3
    Dernier message: 09/01/2010, 10h30
  2. Requête sur plusieurs tables
    Par sta_schmitt dans le forum Requêtes
    Réponses: 2
    Dernier message: 28/03/2006, 13h54
  3. Requéte sur plusieurs tables
    Par polux23 dans le forum Requêtes
    Réponses: 11
    Dernier message: 23/02/2006, 23h00
  4. [SQL] Une requête dans plusieurs tables
    Par Anduriel dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 23/12/2005, 16h23
  5. Requête sur plusieurs tables
    Par drinkmilk dans le forum Langage SQL
    Réponses: 8
    Dernier message: 11/07/2005, 12h25

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