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

Requêtes et SQL. Discussion :

Requête qui ne sélectionne pas tout


Sujet :

Requêtes et SQL.

  1. #1
    Membre régulier

    Inscrit en
    Juin 2006
    Messages
    320
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 320
    Points : 97
    Points
    97
    Par défaut Requête qui ne sélectionne pas tout
    Bonjour à tous,
    j'ai un petit soucis. Je souhaite avoir des infos sur tous les derniers évènements (référencés dans une table) pour chaque dossier défini (référencés dans une autre table).
    Je pensais y arriver (je sélectionne bien un seul évènement et le dernier) mais en bas de mon formulaire il y a 1141 enregistrements et ma requête ne m'en restitue que 942.
    Question que je ne m'étais jamais posée jusqu'ici: à quoi correspondent ces 1136 enregistrements? Ce nombre (1136) correspond au nombre de dossiers.
    Je devrai donc avoir plus de 1136 réponses (car plusieurs évènements peuvent avoir lieu le même jour pour un même dossier).
    Pourquoi ma requête ne me sélectionne pas tout ce que je veux?
    Moi pas comprendre...
    Pour info, la requête (simplifiée):
    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
    SELECT DISTINCT D.reference, 
    PTD.type_demande, ED.date_evenement, 
    PE.evenement
            
    FROM (PARAM_TYPE_DEMANDE PTD INNER JOIN 
    (PARAM_EVENEMENT PE INNER JOIN (EVENEMENT_DU_DOSSIER ED  
    INNER JOIN DOSSIER D ON ED.id_dossier = D.id_dossier) 
     ON PE.id_evenement = ED.id_evenement) 
     ON PTD.id_type_demande = D.id_type_demande) 
    
            
    WHERE ED.date_evenement = (
    SELECT MAX(ED2.date_evenement)  
    FROM EVENEMENT_DU_DOSSIER ED2 
    WHERE ED2.id_dossier = ED.id_dossier)

  2. #2
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 368
    Points : 19 761
    Points
    19 761
    Billets dans le blog
    65
    Par défaut
    tu as essayé sans le where pour voir si ca vient de la ?

  3. #3
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonsoir,

    Les INNER JOIN peuvent aussi restreindre le nombre des enregistrements en cas de non correspondance.

    A+

  4. #4
    Membre régulier

    Inscrit en
    Juin 2006
    Messages
    320
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 320
    Points : 97
    Points
    97
    Par défaut
    J'ai fini par biaiser et faire une seconde requête qui sélectionne tous les autres enregistrements afin de faire le point sur ceux qui ne sont pas à jour (donc ces derniers.
    Néanmoins, je vais avoir besoin de passer outre ce problème de INNER JOIN. Il n'y aurai pas une ruse de sioux?

  5. #5
    say
    say est déconnecté
    Membre expérimenté
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Points : 1 300
    Points
    1 300
    Par défaut
    un LEFT JOIN non?

  6. #6
    Membre régulier

    Inscrit en
    Juin 2006
    Messages
    320
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 320
    Points : 97
    Points
    97
    Par défaut
    Say, quelle est la différence entre left join et inner join?

  7. #7
    say
    say est déconnecté
    Membre expérimenté
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Points : 1 300
    Points
    1 300
    Par défaut


    Le INNER JOIN c'est une jointure d'égal à égal..qui renvoie que les enregistrements qui ont un lien entre les deux tables.

    par ex : CLIENTS INNER JOIN COMMANDES ne renverra que les clients ayant passé au moins une commande

    le LEFT JOIN est une jointure gauche...qui renvoit l'ensemble des clients de la table de gauche..et les infos associées de la table de droit le cas échéant


    par ex : CLIENTS LEFT JOIN COMMANDES renverra tous les clients et leurs commandes éventuelles

  8. #8
    Membre régulier

    Inscrit en
    Juin 2006
    Messages
    320
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 320
    Points : 97
    Points
    97
    Par défaut
    Mais ça m'paraît pas mal ça!!
    J'essaie!

  9. #9
    Membre régulier

    Inscrit en
    Juin 2006
    Messages
    320
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 320
    Points : 97
    Points
    97
    Par défaut
    Donc, si j'ai bien compris, Je devrias avoir toutes mes infos sachant que
    - un dossier n'a pas toujours le demandeur défini
    - un dossier n'a pas toujours d'évènement défini
    etc.
    Dans ces cas là, les dossiers sont quand même affichés mais les infos manquantes (parce qu'aucune correspondance dans l'autre table)... bah, elles manquent quoi. Mais je devrais quand même avoir ma ligne de données correspondant à ce dossier.

    Juste pour ces 3 tables, ça devrait me donner la requête suivante (corrige moi si je me trompe):
    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
    SELECT DISTINCT D.reference, 
                       D.reference_daf,  
                       D.id_dossier, 
                       P.nom_personne,  
                       P.date_naissance,  
                       P.commune,
                       ED.date_evenement,  
                       ED.commentaire_evenement,  
                       D.surface_demandee_ha
    FROM (DOSSIER D LEFT JOIN PERSONNES P ON D.id_personne = P.id_personne)  
                       LEFT JOIN EVENEMENT_DU_DOSSIER ED ON D.id_dossier = ED.id_dossier 
    
    WHERE ED.date_evenement = ( 
                       SELECT MAX(ED2.date_evenement)   
                       FROM EVENEMENT_DU_DOSSIER ED2    
                       WHERE ED2.id_dossier = ED.id_dossier)
    NB: si je ne cherche que les dossiers avec les demandeurs, c'est ok, le compte est bon. Si j'ajoute la table des évènements, chaque dossier est démultiplié par le nombre d'évènement (normal). Mais l'ajout de la clause WHERE La clause WHERE ne va t-elle pas me limiter aux dossiers ayant des évènements définis? Parce que je devrais avoir 1136 dossiers dans mon résultat final et ce n'est pas le cas (seuls 1127 dossiers sont sélectionnés).
    Si c'est la clause where qui limite, comment passer outre?

  10. #10
    say
    say est déconnecté
    Membre expérimenté
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Points : 1 300
    Points
    1 300
    Par défaut
    ben c'est clair que si tu mets un critère qui porte sur une table de droite...
    passez outre le where, là je vois pas trop...
    ici ton critère porte sur une date d'événement...si il n'y pas d'événement, il faudrait voir comment tu veux traiter le cas pour trouver une solution.

    donc :
    si il n'y a pas d'événement associé, souhaites tu récupérer les dossiers malgré tout?

  11. #11
    say
    say est déconnecté
    Membre expérimenté
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Points : 1 300
    Points
    1 300
    Par défaut
    ah..maybe une idée...teste ça :
    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
     
    SELECT DISTINCT D.reference, 
                       D.reference_daf,  
                       D.id_dossier, 
                       P.nom_personne,  
                       P.date_naissance,  
                       P.commune,
                       ED.date_evenement,  
                       ED.commentaire_evenement,  
                       D.surface_demandee_ha
    FROM (DOSSIER D LEFT JOIN PERSONNES P ON D.id_personne = P.id_personne)  
                       LEFT JOIN EVENEMENT_DU_DOSSIER ED ON 
    (
    D.id_dossier = ED.id_dossier 
    AND ED.date_evenement = ( 
                       SELECT MAX(ED2.date_evenement)   
                       FROM EVENEMENT_DU_DOSSIER ED2    
                       WHERE ED2.id_dossier = ED.id_dossier)
    )
    c'est quelque chose qui doit marcher en SQL..je sais pas si Access supporte

  12. #12
    Membre régulier

    Inscrit en
    Juin 2006
    Messages
    320
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 320
    Points : 97
    Points
    97
    Par défaut
    ben c'est clair que si tu mets un critère qui porte sur une table de droite...
    Table de droite?? Tu veux dire sur une table où il n'y aura pas forcément d'enregistrements correspondants?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
                     LEFT JOIN EVENEMENT_DU_DOSSIER ED ON 
    (
    D.id_dossier = ED.id_dossier 
    AND ED.date_evenement = ( 
                       SELECT MAX(ED2.date_evenement)   
                       FROM EVENEMENT_DU_DOSSIER ED2    
                       WHERE ED2.id_dossier = ED.id_dossier)
    )
    En effet, ça ne passe pas:
    Erreur de syntaxe dans l'expression 'D.id_dossier = ED.id_dossier AND ED.date évènement = ...........
    Comment je pourrais sélectionner tous les dossiers et seulement les infos pour les derniers évènements quand il y en a?

  13. #13
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    bonjour,

    essaie avec ça pour voir dans ta requête du post #9:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    WHERE ED.date_evenement = ( 
                       SELECT MAX(ED2.date_evenement)   
                       FROM EVENEMENT_DU_DOSSIER ED2    
                       WHERE ED2.id_dossier = ED.id_dossier)
       OR ED.date_evenement Is Null
    ça devrai inclure les non correspondance

    A+

  14. #14
    Membre régulier

    Inscrit en
    Juin 2006
    Messages
    320
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 320
    Points : 97
    Points
    97
    Par défaut
    C'est pas mal du tout!!
    En contrôlant le résultat, je viens de voir que les enregistrements en plus sont dûs à des évènements ayant eu lieu le même jour pour le même dossier.
    Ca roule!

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

Discussions similaires

  1. [AC-2010] Requête ne sélectionnant pas tout
    Par GuiBar18 dans le forum Requêtes et SQL.
    Réponses: 17
    Dernier message: 17/03/2011, 18h12
  2. [AC-97] Une requête étrange qui n'affiche pas toutes les entrées
    Par ZoliveR dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 22/11/2010, 11h58
  3. Réponses: 7
    Dernier message: 23/10/2005, 22h38
  4. Une requête qui ne reconnait pas is not null
    Par LeBauw dans le forum Access
    Réponses: 2
    Dernier message: 08/09/2005, 12h29
  5. Requête qui ne passe pas
    Par TheBart dans le forum Langage SQL
    Réponses: 2
    Dernier message: 10/08/2005, 10h12

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