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] La requête retourne trop de résultat


Sujet :

Requêtes et SQL.

  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2006
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 37
    Points : 15
    Points
    15
    Par défaut [Requête] La requête retourne trop de résultat
    Bonjour à tous.

    J'ai le problème suivant : j'ai créer un formulaier avec une recherche multi-critère basé sur une requète.

    Dans cette requête, je recueil une multitude d'information de difféerntes tables liées. Mais il y a un problème (regardez le photo que j'ai joint avec)

    La requête ne va pas classer juste la personne avec ID=1, ID=2... Mais va afficher TOUTES les différentes possiblités (je ne m'exprime pas bien, mais si vous regarder la photo ci-joint vous allez comprendre)

    Ce qui fait que lors du résultat de ma recherche, au lieu de m'afficher juste Mr Yavec l'ID n°1 il va m'afficher X fois ce Mr. Y par ce que la requête affiche toute les possibilité.

    J'ai tout essayé... DINSTINCT, DISTINCTROW... rien de marche.

    Voici ici le code VB du de la liste de Résultat :

    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
    41
    42
    43
    44
    45
    46
    47
     
     
    Private Sub RefreshQuery()
     
        SQL = "SELECT ID_Perso, Name, First_Name, Job_Title, Location, Language, Status, Salary, Last_PRP, Strenght, Weaknesses FROM requete_rechmulti Where requete_rechmulti.ID_Perso <>0 "
     
        If Not Me.chkJobTitle Then
            SQL = SQL & "And requete_rechmulti!Job_Title = '" & Me.cmbRechJobTitle & "' "
        End If
     
        If Not Me.chkLocation Then
            SQL = SQL & "And requete_rechmulti!Location = '" & Me.cmbRechLocation & "' "
        End If
     
        If Not Me.chkLanguage Then
            SQL = SQL & "And requete_rechmulti!Language = '" & Me.lstLanguage & "' "
        End If
     
        If Not Me.chkStatus Then
            SQL = SQL & "And requete_rechmulti!Status = '" & Me.cmbRechStatus & "' "
        End If
     
        If Not Me.chkSalary Then
            SQL = SQL & "And requete_rechmulti!Salary like '*" & Me.txtSalary & "*' "
        End If
     
        If Not Me.chkPRP Then
            SQL = SQL & "And requete_rechmulti!Last_PRP like '*" & Me.txtPRP & "*' "
        End If
     
         If Not Me.chkStrenght Then
            SQL = SQL & "And requete_rechmulti!Strenght = '" & Me.lstStrenght & "' "
        End If
     
         If Not Me.chkWeaknesses Then
            SQL = SQL & "And requete_rechmulti!Weaknesses = '" & Me.lstWeaknesses & "' "
        End If
     
        SQLWhere = Trim(Right(SQL, Len(SQL) - InStr(SQL, "Where ") - Len("Where ") + 1))
     
        SQL = SQL & ";"
     
     
        Me.lstResults.RowSource = SQL
        Me.lstResults.Requery
     
    End Sub
    Et la structure de la requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
     
    SELECT T_Perso.ID_Perso, T_Perso.Name, T_Perso.First_Name, T_Job_Title.Job_Title, T_Location.Location, T_Current_Benefits.Salary, T_Performance.Last_PRP, T_Kex_Competencies_Strenght.Strenght, T_Key_Competencies_Weaknesses.Weaknesses, T_Language_Name.Language, T_Perso_Status.Status
    FROM T_Kex_Competencies_Strenght, T_Key_Competencies_Weaknesses, (((T_Perso_Status INNER JOIN (T_Location INNER JOIN (T_Job_Title INNER JOIN T_Perso ON T_Job_Title.ID_Job_Title = T_Perso.Job_Title) ON T_Location.ID_Location = T_Perso.Location) ON T_Perso_Status.ID_Perso_Status = T_Perso.Status) INNER JOIN T_Current_Benefits ON T_Perso.ID_Perso = T_Current_Benefits.ID_Ref_Perso) INNER JOIN (T_Language_Name INNER JOIN T_Language ON T_Language_Name.ID_Language_Name = T_Language.Language) ON T_Perso.ID_Perso = T_Language.ID_Ref_Perso) INNER JOIN T_Performance ON T_Perso.ID_Perso = T_Performance.ID_Ref_Perso
    GROUP BY T_Perso.ID_Perso, T_Perso.Name, T_Perso.First_Name, T_Job_Title.Job_Title, T_Location.Location, T_Current_Benefits.Salary, T_Performance.Last_PRP, T_Kex_Competencies_Strenght.Strenght, T_Key_Competencies_Weaknesses.Weaknesses, T_Language_Name.Language, T_Perso_Status.Status
    HAVING (((T_Perso.ID_Perso)<>0));
    Merci d'avance

  2. #2
    Membre à l'essai
    Inscrit en
    Septembre 2006
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 37
    Points : 15
    Points
    15
    Par défaut
    Personne?

  3. #3
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    316
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 316
    Points : 367
    Points
    367
    Par défaut
    Bonjour,

    les deux tables T_Kex_Competencies_Strenght et T_Key_Competencies_Weaknesses ne sont reliées à aucune table?

    A+

  4. #4
    Membre à l'essai
    Inscrit en
    Septembre 2006
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 37
    Points : 15
    Points
    15
    Par défaut
    Si... Elles sont reliés a nue table T_Kex_Competencies qui est reliés elle-même à la table principale T_Perso...

  5. #5
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    316
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 316
    Points : 367
    Points
    367
    Par défaut
    Bonjour,

    Dans ta requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT T_Perso.ID_Perso, T_Perso.Name, T_Perso.First_Name, T_Job_Title.Job_Title, T_Location.Location, T_Current_Benefits.Salary, T_Performance.Last_PRP, T_Kex_Competencies_Strenght.Strenght, T_Key_Competencies_Weaknesses.Weaknesses, T_Language_Name.Language, T_Perso_Status.Status
    FROM T_Kex_Competencies_Strenght, T_Key_Competencies_Weaknesses, (((T_Perso_Status INNER JOIN (T_Location INNER JOIN (T_Job_Title INNER JOIN T_Perso ON T_Job_Title.ID_Job_Title = T_Perso.Job_Title) ON T_Location.ID_Location = T_Perso.Location) ON T_Perso_Status.ID_Perso_Status = T_Perso.Status) INNER JOIN T_Current_Benefits ON T_Perso.ID_Perso = T_Current_Benefits.ID_Ref_Perso) INNER JOIN (T_Language_Name INNER JOIN T_Language ON T_Language_Name.ID_Language_Name = T_Language.Language) ON T_Perso.ID_Perso = T_Language.ID_Ref_Perso) INNER JOIN T_Performance ON T_Perso.ID_Perso = T_Performance.ID_Ref_Perso
    GROUP BY T_Perso.ID_Perso, T_Perso.Name, T_Perso.First_Name, T_Job_Title.Job_Title, T_Location.Location, T_Current_Benefits.Salary, T_Performance.Last_PRP, T_Kex_Competencies_Strenght.Strenght, T_Key_Competencies_Weaknesses.Weaknesses, T_Language_Name.Language, T_Perso_Status.Status
    HAVING (((T_Perso.ID_Perso)<>0));
    les deux tables T_Kex_Competencies_Strenght et T_Key_Competencies_Weaknesses ne sont reliées par une jointure avec une autre table. (exemple from T_Kex_Competencies_Strenght inner join T_perso on T_perso.id_perso = T_Kex_Competencies_Strenght.id_perso)

    A+

  6. #6
    Membre à l'essai
    Inscrit en
    Septembre 2006
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 37
    Points : 15
    Points
    15
    Par défaut
    Mais maintenant que je regarde bien, le truc bizare, c'est que même si dans le sous-formulaire ou j'ai la possibilité d'attribuer les Kex_Competencies_Sternght ou _Weaknesses , si je ne met rien, dans ma requête, ca m'affiche comme si chaque ID possédait toutes les valeurs du champs des 2 tables... C'est bizare ca

    Mais now si je rajoute la jointure ca me donner ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT T_Perso.ID_Perso, T_Perso.Name, T_Perso.First_Name, T_Job_Title.Job_Title, T_Location.Location, T_Current_Benefits.Salary, T_Performance.Last_PRP, T_Kex_Competencies_Strenght.Strenght, T_Key_Competencies_Weaknesses.Weaknesses, T_Language_Name.Language, T_Perso_Status.Status
    FROM ((((T_Perso_Status INNER JOIN (T_Location INNER JOIN (T_Job_Title INNER JOIN T_Perso ON T_Job_Title.ID_Job_Title = T_Perso.Job_Title) ON T_Location.ID_Location = T_Perso.Location) ON T_Perso_Status.ID_Perso_Status = T_Perso.Status) INNER JOIN T_Current_Benefits ON T_Perso.ID_Perso = T_Current_Benefits.ID_Ref_Perso) INNER JOIN (T_Language_Name INNER JOIN T_Language ON T_Language_Name.ID_Language_Name = T_Language.Language) ON T_Perso.ID_Perso = T_Language.ID_Ref_Perso) INNER JOIN T_Performance ON T_Perso.ID_Perso = T_Performance.ID_Ref_Perso) INNER JOIN (T_Key_Competencies_Weaknesses INNER JOIN (T_Kex_Competencies_Strenght INNER JOIN T_Kex_Competencies ON T_Kex_Competencies_Strenght.ID_Key_Competencies_Strenght = T_Kex_Competencies.Strenght) ON T_Key_Competencies_Weaknesses.ID_Key_Competencies_Weaknesses = T_Kex_Competencies.Weaknesses) ON T_Perso.ID_Perso = T_Kex_Competencies.ID_Ref_Perso
    GROUP BY T_Perso.ID_Perso, T_Perso.Name, T_Perso.First_Name, T_Job_Title.Job_Title, T_Location.Location, T_Current_Benefits.Salary, T_Performance.Last_PRP, T_Kex_Competencies_Strenght.Strenght, T_Key_Competencies_Weaknesses.Weaknesses, T_Language_Name.Language, T_Perso_Status.Status
    HAVING (((T_Perso.ID_Perso)<>0));
    Et la, ya plus rien qui s'affiche...

  7. #7
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    316
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 316
    Points : 367
    Points
    367
    Par défaut
    Bonjour,

    Quand tu ouvre deux tables par exemple T1 et T2, et qu'il n' ya pas de jointures entres elles tu auras comme résultat le produit cartésien des deux tables.
    exple : si T1 contient 100 enregistrements et T2 contient 50 enregistrements et tu fait un Select sur les deux Tables on obtient comme résultat 100*50 =5000 enregistrements.

    A+

  8. #8
    Membre à l'essai
    Inscrit en
    Septembre 2006
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 37
    Points : 15
    Points
    15
    Par défaut
    Ah d'accord....

    C'est pour ca que ca m'affiche genre 6000 X mes résultats....

    Donc quelle serait la solution dans ce cas la?

    Par ce que comme j'ai dit, si je rajoute la jointure comme j'ai mis dans le code juste en haut, il n'y a plus rien qui s'affiche...

    Par ce que ce n'est pas que pour les _Competencies_ mais par exemple pour la table des langues c'est pareil

  9. #9
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    316
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 316
    Points : 367
    Points
    367
    Par défaut
    Bonjour,

    Je te conseille dans access de créer ta requête en faisant les jointures sans le group by et de voir déjà si tu obtient le résultat voulu.


    A+

  10. #10
    Membre à l'essai
    Inscrit en
    Septembre 2006
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 37
    Points : 15
    Points
    15
    Par défaut
    Bonjour,

    J'ai essayé sans le group by, j'ai essayé de rajuoter toute les jointures mais ca ne amrche pas.

    En fait, dès qu'un sous formulaire est relié un des sous tables, ca ne amrche pas...

    En fait, si en partant de la table principal T_Perso, je le lie avec 1 seul table, comme par exemple T_Perso_Status ca fonctionne bien.

    Mais dès que je doit lié T_Perso avec T_Langugae qui est lui même relié à t_Language_Name, a ce moment, plus rien ne s'affiche...

  11. #11
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    316
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 316
    Points : 367
    Points
    367
    Par défaut
    Bonjour,

    D'après moi il y a un problème de jointure.

    A+

  12. #12
    Membre à l'essai
    Inscrit en
    Septembre 2006
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 37
    Points : 15
    Points
    15
    Par défaut
    J'en suis également Persuader, mais je ne voit pas qu'ou ca vient...

  13. #13
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Que donne le débuguage de la requête ?

    Debug.Print SQL ?

  14. #14
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    316
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 316
    Points : 367
    Points
    367
    Par défaut
    Bonjour,

    en enlevant les deux tables Kex_Competencies_Sternght et _Weaknesses j'obtiens 4 records (2 pour idclient 5 et deux pour idclient 8) et comme chaqun parle deux langues c'est tout à fait normal que piur chaque IDclient il affiche 2 Records. Même si tu fais un group by il ne seront pas grouper vu que le champ language n'a pas la même valeur (exemple English et French).
    Exemple : IDclient 5 parle deux langues English French.
    Dans Table T_language tu auras 2 Records
    ID_Ref_client--------language
    5--------------1
    5--------------2

    si tu relie l'enregistrement T_client avec la table T_language
    IDCLIENT-------Nom--------Language
    5--------------Barbir-------French
    5--------------Barbir-------English
    Ce qui est normal.
    et si tu fais un group by ça ne marche pas, tous les champs ne sont pas identique piur les 2 records.

    A+

  15. #15
    Membre à l'essai
    Inscrit en
    Septembre 2006
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 37
    Points : 15
    Points
    15
    Par défaut
    Bonjour,

    Alors tout d'abord il n'y a pas de bug... Tout est correct, c'est juste une question d'affichage...

    Ensuite, moi aussi en enelevant les deux table _Competencies_ ca me met que quelque records. Mais le but final est de garder les 2 tables...

    Est-t-il donc impossible d'afficher dans la LstResults uniquement 1 résultats (même si Mr Y qui a l'ID 5 parle 2 langues etc... juste afficher une ligne avec sont ID sans qu'elle s'affiche 6000 X?)

    N'est -til pas possible pas exemple de contraidre la liste a n'afficher uniquement une ligne par ID?

  16. #16
    Expert éminent
    Avatar de cafeine
    Inscrit en
    Juin 2002
    Messages
    3 904
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 3 904
    Points : 6 781
    Points
    6 781
    Par défaut
    Citation Envoyé par Tofalu
    Que donne le débuguage de la requête ?

    Debug.Print SQL ?
    + 1
    Ne mettez pas "Problème" dans vos titres, par définition derrière toute question se cache un problème
    12 tutoriels Access



  17. #17
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    il suffit de mettre les champs compétences en where seulement
    (donc ni dans le group by ni dans un having)
    Elle est pas belle la vie ?

  18. #18
    Membre à l'essai
    Inscrit en
    Septembre 2006
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 37
    Points : 15
    Points
    15
    Par défaut
    pour le debug ca m'affiche ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT ID_Perso, Name, First_Name, Job_Title, Location, Language, Status, Salary, Last_PRP, Strenght, Weaknesses FROM requete_rechmulti Where requete_rechmulti.ID_Perso <>0 And requete_rechmulti!Job_Title = '' ;
    SELECT ID_Perso, Name, First_Name, Job_Title, Location, Language, Status, Salary, Last_PRP, Strenght, Weaknesses FROM requete_rechmulti Where requete_rechmulti.ID_Perso <>0 And requete_rechmulti!Job_Title = 'Ceo' ;
    SELECT ID_Perso, Name, First_Name, Job_Title, Location, Language, Status, Salary, Last_PRP, Strenght, Weaknesses FROM requete_rechmulti Where requete_rechmulti.ID_Perso <>0 ;

Discussions similaires

  1. Requête MAX qui me retourne trop de réponses
    Par tibofo dans le forum Langage SQL
    Réponses: 4
    Dernier message: 24/01/2014, 15h15
  2. [FLASH 8] Transformer un 1234 en 1 234
    Par baleiney dans le forum Flash
    Réponses: 16
    Dernier message: 13/07/2006, 12h46
  3. rassembler 2 requ[ete.
    Par shirya dans le forum Langage SQL
    Réponses: 7
    Dernier message: 28/09/2005, 13h59
  4. Requ^te avec 2 COUNT ?
    Par Freiya dans le forum Langage SQL
    Réponses: 8
    Dernier message: 09/07/2005, 13h21
  5. comment rajouter un caractère " ' " dans une requê
    Par GDVL dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 30/07/2004, 16h58

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