Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > Requêtes et SQL.
Requêtes et SQL. Tout ce qui concerne vos questions sur les requêtes et le SQL sous Access se trouve ici.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 04/04/2011, 08h41   #1
Membre régulier
 
Inscription : novembre 2010
Messages : 151
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : novembre 2010
Messages : 151
Points : 89
Points : 89
Par défaut Requête non correspondance - Problème

Bonjour,

J'ai une table Badge (Badge, Observations) et une table Cotisations (Année, Nom, Badge, ...). Les clés sont précisées en gras. Je veux faire une requête de non correspondance en filtrant sur [Année]. Cela ne fonctionne pas.

Si au lieu de la table Cotisation, j'utilise une requête, cela fonctionne!!

Pourquoi et que faire?

Jean-Pierre
jeanpierre78 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2011, 15h57   #2
Expert Confirmé
 
Avatar de Richard_35
 
Homme
Inscription : juillet 2007
Messages : 2 176
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : juillet 2007
Messages : 2 176
Points : 2 805
Points : 2 805
Bonjour Jeanpierre78,

Citation:
Envoyé par Jeanpierre78
Si au lieu de la table Cotisation, j'utilise une requête, cela fonctionne!!
==> pas clair...

Je ne vois aucune raison pour laquelle une requête de non-correspondance sur ces deux tables ne fonctionnerait pas. Via l'assistant "requête de non-correspondance" :
-Table : Badge
- Table : Cotisations
- Champs correspondants : Badge <=> Badge
- Champs sélectionnés : tous
- Afficher les résultats.
==> cela devrait être OK.

Tout cela, en supposant que tu veuilles les Badges sans Cotisation.
__________________
Dis-nous et à bientôt,
Richard.
----------------------------------------------------------------------------------------------
En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !
Richard_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2011, 17h29   #3
Membre régulier
 
Inscription : novembre 2010
Messages : 151
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : novembre 2010
Messages : 151
Points : 89
Points : 89
Bonjour,

En effet, je pensais la même chose. Hors, lorsque je fais la manip que tu décris et que je filtre sur [Année] de la table Cotisations, je devrais avoir 50 badges non utilisés en 2010. Le résult de la requête est : pas de non concordance!!

Si je remplace la table Cotisations par une requête sur laquelle je filtre sur [Année], cela fonctionne!!

Je n'y comprends rien!!

Jean-Pierre
jeanpierre78 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2011, 17h37   #4
Expert Confirmé
 
Avatar de Richard_35
 
Homme
Inscription : juillet 2007
Messages : 2 176
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : juillet 2007
Messages : 2 176
Points : 2 805
Points : 2 805
Citation:
Envoyé par Jeanpierre78
Hors, lorsque je fais la manip que tu décris et que je filtre sur [Année] de la table Cotisations, je devrais avoir 50 badges non utilisés en 2010
==> si tu ne filtres pas sur l'année, trouves-tu des non correspondances ?
__________________
Dis-nous et à bientôt,
Richard.
----------------------------------------------------------------------------------------------
En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !
Richard_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2011, 18h43   #5
Membre régulier
 
Inscription : novembre 2010
Messages : 151
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : novembre 2010
Messages : 151
Points : 89
Points : 89
Bonsoir,

Si je ne filtre pas sur [Année], je ne trouve pas de non correspondances car dans ce cas, il n'y en a pas.

Certains badges distribués en 2008 ou 2009 n'ont pas été validés en 2010 car l'adhérent n'a pas renouvelé sa cotisation mais le numéro est présent dans la table Badge. Le but de ma requête est de lister les badges existants non validés en 2010 qui sont encore en possession d'anciens adhérents.

Ci après le lien vers la représentation de mes realtions entre tables :
http://img705.imageshack.us/i/bdbadges.jpg/

Encore une fois si pour les badges valide en 2010, j'utilise une requête paramètrée au lieu de la table Cotisation cela fonctionne!! J'ai donc contourné la difficulté en utilisant une requête au lieu de la table.

Jean-Pierre
jeanpierre78 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2011, 18h51   #6
Expert Confirmé
 
Avatar de Richard_35
 
Homme
Inscription : juillet 2007
Messages : 2 176
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : juillet 2007
Messages : 2 176
Points : 2 805
Points : 2 805
Pas très clair...

Citation:
Envoyé par Jeanpierre78
Si je ne filtre pas sur [Année], je ne trouve pas de non correspondances car dans ce cas, il n'y en a pas.
et, si tu ajoutes un autre élément de sélection ("et")
Citation:
Envoyé par Jeanpierre78
Hors, lorsque je fais la manip que tu décris et que je filtre sur [Année] de la table Cotisations, je devrais avoir 50 badges non utilisés en 2010
==> alors, il est normal que ta requête ne te trouve aucun enregistrement : tu as ajouté un "et" à une requête qui ne te trouve rien, d'origine...


D'autre part, si
Citation:
Envoyé par Jeanpierre78
Encore une fois si pour les badges valide en 2010, j'utilise une requête paramètrée au lieu de la table Cotisation cela fonctionne!!
c'est que tu ne pars pas de la même base...


Peux-tu poster l'image graphique de la requête qui ne fonctionne pas si tu ajoutes un filtre (pas de la relation) ?
__________________
Dis-nous et à bientôt,
Richard.
----------------------------------------------------------------------------------------------
En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !
Richard_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2011, 13h45   #7
Membre régulier
 
Inscription : novembre 2010
Messages : 151
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : novembre 2010
Messages : 151
Points : 89
Points : 89
Bonjour,

Ci après le lien vers l'image de la requête qui ne fonctionne pas :
http://img806.imageshack.us/i/requtesurtables.jpg/

Cette requête n'affiche pas de données alors qu'il y a plus de 50 badges présents dans la table Badge mais pas dans la table Cotisation en 2010. Ils étaient dans la table Cotisation en 2008 ou 2009. Si je remplace la table Cotisation par une requête qui filtre sur l'année ça fonctionne.

Jean-Pierre
jeanpierre78 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2011, 14h38   #8
Expert Confirmé
 
Avatar de Richard_35
 
Homme
Inscription : juillet 2007
Messages : 2 176
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : juillet 2007
Messages : 2 176
Points : 2 805
Points : 2 805
Bonjour Jeanpierre78,

Ta requête est correcte.

Dans cette même requête
- supprimes le critère "2010" de la colonne "Année" de la table "Cotisation" ;
- lances la requête.
==> vois-tu apparaître des enregistrements de 2010 ?
__________________
Dis-nous et à bientôt,
Richard.
----------------------------------------------------------------------------------------------
En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !
Richard_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2011, 18h20   #9
Membre régulier
 
Inscription : novembre 2010
Messages : 151
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : novembre 2010
Messages : 151
Points : 89
Points : 89
Bonsoir Richard_35,

Si je supprime le filtre sur le Champ [Année], je n'ai pas de résultat dans la requête ce qui est normal car dans ce cas tous les N° de badge de la table Badge sont présent dans la table Cotisation.

Si je filtre sur l'Année 2010, je devrais voir 520 non correspondances représentant 52 N° de badge existants dans la table Badge et non utilisés en 2010 dans la table Cotisation.

Bizarre, si je fais ma requête à partir de la table Badge et d'une requête paramètrée Badges_saison pour extraire les badges de utilisés dans la saison sélectionnée, la requête fonctionne. Si je le fais directement à partir des tables Badge et Cotisation, cela ne fonctionne pas!

Jean-Pierre
jeanpierre78 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2011, 18h42   #10
Expert Confirmé
 
Avatar de Richard_35
 
Homme
Inscription : juillet 2007
Messages : 2 176
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : juillet 2007
Messages : 2 176
Points : 2 805
Points : 2 805
Citation:
Envoyé par Jeanpierre78
Si je supprime le filtre sur le Champ [Année], je n'ai pas de résultat dans la requête ce qui est normal car dans ce cas tous les N° de badge de la table Badge sont présent dans la table Cotisation.
==> a fortiori, donc, tu n'auras aucun résultat si tu mets un filtre : tu es d'accord ?


Citation:
Envoyé par Jeanpierre78
Si je filtre sur l'Année 2010, je devrais voir 520 non correspondances représentant 52 N° de badge existants dans la table Badge et non utilisés en 2010 dans la table Cotisation.
==> c'est exactement le contraire de ce que tu viens de dire avant !...


Citation:
Envoyé par Jeanpierre78
Bizarre, si je fais ma requête à partir de la table Badge et d'une requête paramètrée Badges_saison pour extraire les badges de utilisés dans la saison sélectionnée, la requête fonctionne. Si je le fais directement à partir des tables Badge et Cotisation, cela ne fonctionne pas!
==> c'est que tu vas prendre l'année sur une autre table que la table Cotisation : vérifies ta "requête paramètrée Badges_saison".
__________________
Dis-nous et à bientôt,
Richard.
----------------------------------------------------------------------------------------------
En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !
Richard_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 12h32   #11
Membre régulier
 
Inscription : novembre 2010
Messages : 151
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : novembre 2010
Messages : 151
Points : 89
Points : 89
Bonjour,

Ma table Badges contient TOUT les numéros de badges utilisées depuis le début.

Ma table Cotisations contient pour chaque année les enregistrement des membre (Genre, Nom_fam, Prénom, Année, Badge, ...).

Par exemple en 2010, il y 52 membres inscrits en 2009 et /ou 2008 qui ne sont pas inscrits en 2010. Il y a donc 52 N° de badge non valides en 2010 mais présents dans la table Badges. Ce sont ces N° de badges que je veux utiliser dans ma liste déroulante.

Ci après ma requête Badge_saison :



Le choix de l'année est fait par une formule qui du 01-09-10 au 31-08-11 affiche 2010.

Nota : Ma liste déroulante fonctionnant avec la requête, ma recherche est surtout de comprendre pourquoi cela ne fonctionne pas avec la table Cotisations.


Jean-Pierre
jeanpierre78 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 12h49   #12
Expert Confirmé
 
Avatar de vodiem
 
Homme Diem VO
Vivre
Inscription : avril 2006
Messages : 2 644
Détails du profil
Informations personnelles :
Nom : Homme Diem VO
Âge : 40
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Vivre
Secteur : Conseil

Informations forums :
Inscription : avril 2006
Messages : 2 644
Points : 3 895
Points : 3 895
salut jeanpierre78 et Richard_35,

Citation:
Envoyé par jeanpierre78
ma recherche est surtout de comprendre pourquoi cela ne fonctionne pas avec la table Cotisations
tu as surement un pb sur le format année qui doit différer entre cotation et ta requete.
si tu trouves pas poste une db concis du pb.
vodiem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 17h30   #13
Expert Confirmé
 
Avatar de Richard_35
 
Homme
Inscription : juillet 2007
Messages : 2 176
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : juillet 2007
Messages : 2 176
Points : 2 805
Points : 2 805
Bonjour Jeanpierre78,

Eh bien, c'est normal !... problème d'interprétation...

Reprenons :
Citation:
Envoyé par Richard_35
Via l'assistant "requête de non-correspondance" :
- Table : Badge
- Table : Cotisations
- Champs correspondants : Badge <=> Badge
- Champs sélectionnés : tous
- Afficher les résultats.
Citation:
Envoyé par Jeanpierre78
En effet, je pensais la même chose. Hors, lorsque je fais la manip que tu décris et que je filtre sur [Année] de la table Cotisations, je devrais avoir 50 badges non utilisés en 2010. Le résult de la requête est : pas de non concordance!!
==> La non-correspondance se fait sur Badge, et non sur Badge ET Année. Et comme tous les badges existent pour, au moins, une année, il n'y a pas de non-correspondance.


Donc, en prenant, via l'assistant :
- Table : Badge
- Table : Badges_saison
- Champs correspondants : Badge <=> Badge
- Champs sélectionnés : tous
- Afficher les résultats.
==> Comme Badges_saison ne te donne QUE les cotisations 2010, la non correspondance Badge <=> Badge fonctionne !

OK ?
__________________
Dis-nous et à bientôt,
Richard.
----------------------------------------------------------------------------------------------
En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !
Richard_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 19h04   #14
Membre régulier
 
Inscription : novembre 2010
Messages : 151
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : novembre 2010
Messages : 151
Points : 89
Points : 89
Bonsoir,

Lorsque je définis ma requête avec la table Badge et la requête Badge_saison, ça fonctionne.

Jean-Pierre
jeanpierre78 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 19h13   #15
Expert Confirmé
 
Avatar de Richard_35
 
Homme
Inscription : juillet 2007
Messages : 2 176
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : juillet 2007
Messages : 2 176
Points : 2 805
Points : 2 805
C'est normal.

As-tu lu l'explication figurant dans le post #13 ?
Peut-être n'est-elle pas très claire.
__________________
Dis-nous et à bientôt,
Richard.
----------------------------------------------------------------------------------------------
En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !
Richard_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/04/2011, 12h12   #16
Expert Confirmé Sénior
 
Avatar de f-leb
 
Homme Fabien
Enseignant
Inscription : janvier 2009
Messages : 2 410
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 41
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : janvier 2009
Messages : 2 410
Points : 4 439
Points : 4 439
Bonjour,

Si je puis apporter quelques éclaircissements…

Ce n’est pas la même chose de dire :
1°) Rechercher les cotisations de l’année 2010 sans badge
2°) Rechercher les badges non utilisés parmi les cotisations de l’année 2010


Dans le cas 1°) j’écrirais:
Code sql :
1
2
3
SELECT * FROM Badge INNER JOIN Cotisation
ON Badge.badge=Cotisation.badge
WHERE Cotisation.Annee=2010 AND Cotisation. Badge IS NULL;

Ce qui dans ce cas précis est équivalent à:
Code sql :
1
2
3
SELECT * FROM Badge LEFT JOIN Cotisation
ON Badge.badge=Cotisation.badge
WHERE Cotisation.Annee=2010 AND Cotisation.Badge IS NULL;

Et comme constaté par JeanPierre78 dans son post #7, la requête ne renvoie rien ce qui est logique puisque la condition sur la clé étrangère Cotisation.Badge à Null et sur l’année 2010 ne peut être vérifiée (si un adhérent a cotisé en 2010, il a forcément eu un badge).


En fait pour répondre au cas n°2, il me semble qu’il faudrait déplacer la condition sur l’année de la clause WHERE vers la clause de jointure ON, du genre :
Code sql :
1
2
3
SELECT * FROM Badge LEFT JOIN Cotisation
ON Badge.badge=Cotisation.badge AND Cotisation.Annee=2010
WHERE Cotisation.Badge is Null;

Seulement ce type de jointure n’est pas accepté sous Access. Il faut donc opérer en deux temps avec une sous-requête comme l’a constaté également JeanPierre78 :
-Rechercher les cotisations de l’année 2010 (requête : R_Cotisation2010)
-Rechercher les badges de la table Badge sans correspondance dans R_Cotisation2010

Voilà…
f-leb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/04/2011, 20h09   #17
Expert Confirmé
 
Avatar de Richard_35
 
Homme
Inscription : juillet 2007
Messages : 2 176
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : juillet 2007
Messages : 2 176
Points : 2 805
Points : 2 805
Bonsoir Fabien,

Je plussoie... Jeanpierre78 itou ?...
__________________
Dis-nous et à bientôt,
Richard.
----------------------------------------------------------------------------------------------
En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !
Richard_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/04/2011, 18h28   #18
Membre régulier
 
Inscription : novembre 2010
Messages : 151
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : novembre 2010
Messages : 151
Points : 89
Points : 89
Bonsoir,

C'est effectivement ce que j'ai constaté.

Jean-Pierre
jeanpierre78 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h45.


 
 
 
 
Partenaires

Hébergement Web