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 :

Sql perte de données sur deux requêtes


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 129
    Points : 63
    Points
    63
    Par défaut Sql perte de données sur deux requêtes
    Bonjour voici un probleme que je viens de rencontrer :

    premiere requete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT etu.etu_numero, etu.etu_old_matricule, etu.etu_nom, etu.etu_prenom,etu.etu_nai_date, etu.etu_nai_lieu, etu.etu_sexe, etu.etu_doublant, p.pay_nationalite, s.sta_libelle, etu.etu_sit_famille, etu.etu_enf_nb, etu.etu_1_adresse, r.res_1_adresse, et.etap_libelle, c.cla_libelle
    FROM etudiant etu, ia i, etablissement e, etape et, pays p, statut s, responsable r, classe c
    where r.res_id=etu.res_id
      AND i.etu_id=etu.etu_id
      AND s.sta_id=etu.etu_ins_situation
      AND p.pay_id=etu.etu_nationalite
      AND i.etap_id=et.etap_id
      AND i.cla_id=c.cla_id
      AND et.eta_id=e.eta_id
      AND e.eta_id='5'

    la deuxieme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT etu.etu_numero, etu.etu_old_matricule, etu.etu_nom, etu.etu_prenom,etu.etu_nai_date, etu.etu_nai_lieu, etu.etu_sexe, etu.etu_doublant, p.pay_nationalite, s.sta_libelle, etu.etu_sit_famille, etu.etu_enf_nb, etu.etu_1_adresse, r.res_1_adresse, et.etap_libelle
    FROM etudiant etu, ia i, etablissement e, etape et, pays p, statut s, responsable r
    where r.res_id=etu.res_id
      AND i.etu_id=etu.etu_id
      AND s.sta_id=etu.etu_ins_situation
      AND p.pay_id=etu.etu_nationalite
      AND i.etap_id=et.etap_id
      AND et.eta_id=e.eta_id
      AND e.eta_id='5'
    La premiere retourne 1678 resultats et la deuxieme 2298

    C'est en enlevant l affichage de la classe sur la deuxieme que je recupere les données manquantes.
    et les données manquantes correspondent aux etudiants qui ont la classe a nul.

    Je ne comprends pas pourquoi il n affiche pas tous les etudiants, meme ceux ayant une classe a nul...

    Merci pour votre aide

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 102
    Points : 28 403
    Points
    28 403
    Par défaut
    Il faut utiliser des jointures externes...
    Cours sur les Jointures en SQL

  3. #3
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 129
    Points : 63
    Points
    63
    Par défaut Ouep
    Merci !

    voici la requête :
    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
    19
    20
     
    SELECT etu.etu_numero, etu.etu_old_matricule, etu.etu_nom, etu.etu_prenom,etu.etu_nai_date, etu.etu_nai_lieu, etu.etu_sexe, etu.etu_doublant, p.pay_nationalite, s.sta_libelle, etu.etu_sit_famille, etu.etu_enf_nb, etu.etu_1_adresse, r.res_1_adresse, et.etap_libelle, c.cla_libelle
    FROM
      etudiant etu,
      ia i
      LEFT OUTER JOIN classe c
                ON c.cla_id=i.cla_id
      LEFT OUTER JOIN etape et
                ON et.etap_id=i.etap_id,
      etablissement e,
      pays p,
      statut s,
      responsable r
     
    where r.res_id=etu.res_id
      AND i.etu_id=etu.etu_id
      AND s.sta_id=etu.etu_ins_situation
      AND p.pay_id=etu.etu_nationalite
      AND et.eta_id=e.eta_id
      AND e.eta_id='5'

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 102
    Points : 28 403
    Points
    28 403
    Par défaut
    Evitez de mélanger les jointures normalisées avec les jointures dans la clause WHERE.
    L'utilisation de jointures normalisées (INNER JOIN) permet de séparer ce qui dépend de la jointure proprement dite du filtre sur les données.
    La requête est ainsi plus lisible ; vous ne risquez plus les produits cartésiens sur une table présente dans la clause FROM sans jointure.
    Votre requête sera aussi plus évolutive : rien de plus simple que de remplacer INNER par LEFT ou RIGHT pour en faire une jointure externe.

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    SELECT  etu.etu_numero
        ,   etu.etu_old_matricule
        ,   etu.etu_nom
        ,   etu.etu_prenom
        ,   etu.etu_nai_date
        ,   etu.etu_nai_lieu
        ,   etu.etu_sexe
        ,   etu.etu_doublant
        ,   p.pay_nationalite
        ,   s.sta_libelle
        ,   etu.etu_sit_famille
        ,   etu.etu_enf_nb
        ,   etu.etu_1_adresse
        ,   r.res_1_adresse
        ,   et.etap_libelle
        ,   c.cla_libelle
    FROM    etudiant etu
        INNER JOIN
            ia i
            ON  i.etu_id = etu.etu_id
        LEFT OUTER JOIN
            classe c
            ON  c.cla_id = i.cla_id
        LEFT OUTER JOIN
            etape et
            ON  et.etap_id=i.etap_id
        LEFT OUTER JOIN
            etablissement e
            ON  et.eta_id = e.eta_id
        INNER JOIN
            pays p
            ON  p.pay_id = etu.etu_nationalite
        INNER JOIN
            statut s
            ON  s.sta_id = etu.etu_ins_situation
        INNER JOIN
            responsable r
            ON  r.res_id = etu.res_id
    WHERE   e.eta_id = '5'
    ;

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

Discussions similaires

  1. Votre avis sur deux requètes SQL
    Par americ dans le forum Développement
    Réponses: 6
    Dernier message: 05/11/2014, 16h25
  2. requête SQL: recuperation de données sur plusieurs années
    Par MisterGé dans le forum Langage SQL
    Réponses: 5
    Dernier message: 01/08/2007, 23h10
  3. [SQL] Besoin d'aide sur une requête
    Par moonboot dans le forum Oracle
    Réponses: 1
    Dernier message: 01/08/2006, 15h56
  4. [SQL] Besoin d'aide sur une requête
    Par Angath dans le forum Langage SQL
    Réponses: 2
    Dernier message: 17/01/2006, 16h26
  5. Réponses: 1
    Dernier message: 03/08/2005, 11h41

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