Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Comment éviter les doublons dans une requête

14 réponses
Avatar
Freeman
Bonjour,
Comment éviter les doublons dans une requête ?
........................................................................
Je souhaite convoquer des adhérents ayant été membres ces trois
dernières années:

- une table adhérents
Avec un Champ : Nom

- une table adhésion
Avec un Champ années

Dans les champs -Nom certains ont été membres tous les ans et d'autres non.
.............................................................................
Dans ma requête j'ai demandé regroupement, mais j'ai du oublié autre chose
car ça ne fonctionne pas.
D'avance merci !

10 réponses

1 2
Avatar
P3859
Le 12/02/2011 23:44, Freeman a écrit :
Bonjour,
Comment éviter les doublons dans une requête ?
........................................................................
Je souhaite convoquer des adhérents ayant été membres ces trois dernières années:

- une table adhérents
Avec un Champ : Nom

- une table adhésion
Avec un Champ années

Dans les champs -Nom certains ont été membres tous les ans et d'autres non.
.............................................................................
Dans ma requête j'ai demandé regroupement, mais j'ai du oublié autre chose
car ça ne fonctionne pas.
D'avance merci !




bonjour,
tu as essayé : http://cerig.efpg.inpg.fr/tutoriel/bases-de-donnees/chap19.htm

l'option "distinct"
Avatar
Post Scriptum
"P3859" a écrit dans le message de news:
4d57b357$0$11586$
bonjour,
tu as essayé :
http://cerig.efpg.inpg.fr/tutoriel/bases-de-donnees/chap19.htm

l'option "distinct"



Bonjour,
je viens enfin de trouver, il fallait écrire MAX dans le champs années.
Merci pour le tutoriel .

DISTINCT se met tout seul en SQL en mettant "oui" dans la propriété de la
requête Valeur distinct
Avatar
Post Scriptum
"P3859" a écrit dans le message de news:
4d57b357$0$11586$
Le 12/02/2011 23:44, Freeman a écrit :
Bonjour,
Comment éviter les doublons dans une requête ?
........................................................................
Je souhaite convoquer des adhérents ayant été membres ces trois dernières
années:

- une table adhérents
Avec un Champ : Nom

- une table adhésion
Avec un Champ années

Dans les champs -Nom certains ont été membres tous les ans et d'autres
non.
.............................................................................
Dans ma requête j'ai demandé regroupement, mais j'ai du oublié autre
chose
car ça ne fonctionne pas.
D'avance merci !




bonjour,
tu as essayé :
http://cerig.efpg.inpg.fr/tutoriel/bases-de-donnees/chap19.htm

l'option "distinct"



Comme ça :
http://cjoint.com/?0cnreLyNSdK
Avatar
Michel__D
Bonjour,

Post Scriptum a écrit :
"P3859" a écrit dans le message de news:
4d57b357$0$11586$
Le 12/02/2011 23:44, Freeman a écrit :
Bonjour,
Comment éviter les doublons dans une requête ?
........................................................................
Je souhaite convoquer des adhérents ayant été membres ces trois dernières
années:

- une table adhérents
Avec un Champ : Nom

- une table adhésion
Avec un Champ années

Dans les champs -Nom certains ont été membres tous les ans et d'autres
non.
.............................................................................
Dans ma requête j'ai demandé regroupement, mais j'ai du oublié autre
chose
car ça ne fonctionne pas.
D'avance merci !




bonjour,
tu as essayé :
http://cerig.efpg.inpg.fr/tutoriel/bases-de-donnees/chap19.htm

l'option "distinct"



Comme ça :
http://cjoint.com/?0cnreLyNSdK




J'aimerais bien voir le SQL de la requête car je pense que tu n'as pas besoin de "DISTINCT".
Avatar
Freeman
Le 13/02/2011 17:17, Michel__D a écrit :

bonjour,
tu as essayé :
http://cerig.efpg.inpg.fr/tutoriel/bases-de-donnees/chap19.htm

l'option "distinct"



Comme ça :
http://cjoint.com/?0cnreLyNSdK




J'aimerais bien voir le SQL de la requête car je pense que tu n'as pas
besoin de "DISTINCT".



Tu sais je ne suis pas un Pro, sinon je ne poserai pas ce genre de question.
Avant j'allais me faire aider sur les forum Microsoft, mais il ne
doivent plus exister ?

Comme ça :

SELECT DISTINCT adhérents.Titre, adhérents.Prénom, adhérents.Nom,
adhérents.Adresse1, adhérents.Adresse2, adhérents.[Code Postal],
adhérents.Ville, adhérents.retraité, Max(adhésion.année) AS MaxDeannée
FROM adhérents INNER JOIN adhésion ON adhérents.refadherent =
adhésion.refadherent
GROUP BY adhérents.Titre, adhérents.Prénom, adhérents.Nom,
adhérents.Adresse1, adhérents.Adresse2, adhérents.[Code Postal],
adhérents.Ville, adhérents.retraité
HAVING (((adhérents.retraité)=True) AND ((Max(adhésion.année)) 09)) OR
(((adhérents.retraité)=True) AND ((Max(adhésion.année)) 10)) OR
(((adhérents.retraité)=True) AND ((Max(adhésion.année)) 11))
ORDER BY adhérents.Nom;
Avatar
Michel__D
Re,

Freeman a écrit :
Le 13/02/2011 17:17, Michel__D a écrit :

bonjour,
tu as essayé :
http://cerig.efpg.inpg.fr/tutoriel/bases-de-donnees/chap19.htm

l'option "distinct"



Comme ça :
http://cjoint.com/?0cnreLyNSdK




J'aimerais bien voir le SQL de la requête car je pense que tu n'as pas
besoin de "DISTINCT".



Tu sais je ne suis pas un Pro, sinon je ne poserai pas ce genre de
question.
Avant j'allais me faire aider sur les forum Microsoft, mais il ne
doivent plus exister ?

Comme ça :

SELECT DISTINCT adhérents.Titre, adhérents.Prénom, adhérents.Nom,
adhérents.Adresse1, adhérents.Adresse2, adhérents.[Code Postal],
adhérents.Ville, adhérents.retraité, Max(adhésion.année) AS MaxDeannée
FROM adhérents INNER JOIN adhésion ON adhérents.refadherent =
adhésion.refadherent
GROUP BY adhérents.Titre, adhérents.Prénom, adhérents.Nom,
adhérents.Adresse1, adhérents.Adresse2, adhérents.[Code Postal],
adhérents.Ville, adhérents.retraité
HAVING (((adhérents.retraité)=True) AND ((Max(adhésion.année)) 09)) OR
(((adhérents.retraité)=True) AND ((Max(adhésion.année)) 10)) OR
(((adhérents.retraité)=True) AND ((Max(adhésion.année)) 11))
ORDER BY adhérents.Nom;




Normalement le SQL suivant devrait fournir le même résultat :

SELECT T1.Titre, T1.[Prénom], T1.Nom, T1.Adresse1, T1.Adresse2, T1.[Code Postal], T1.Ville, T1.[retraité], Max(T2.[année]) AS MaxDeannée
FROM [adhérents] AS T1 INNER JOIN [adhésion] AS T2 ON T1.refadherent = T2.refadherent
GROUP BY T1.Titre, T1.[Prénom], T1.Nom, T1.Adresse1, T1.Adresse2, T1.[Code Postal], T1.Ville, T1.[retraité]
HAVING T1.[retraité]=True AND Max(T2.[année])> 09 AND Max(T2.[année])< 11
ORDER BY T1.Nom;
Avatar
db
Le 13/02/2011 18:35, Michel__D a écrit :

Normalement le SQL suivant devrait fournir le même résultat :

SELECT T1.Titre, T1.[Prénom], T1.Nom, T1.Adresse1, T1.Adresse2, T1.[Code
Postal], T1.Ville, T1.[retraité], Max(T2.[année]) AS MaxDeannée
FROM [adhérents] AS T1 INNER JOIN [adhésion] AS T2 ON T1.refadherent > T2.refadherent
GROUP BY T1.Titre, T1.[Prénom], T1.Nom, T1.Adresse1, T1.Adresse2,
T1.[Code Postal], T1.Ville, T1.[retraité]
HAVING T1.[retraité]=True AND Max(T2.[année])> 09 AND
Max(T2.[année])< 11
ORDER BY T1.Nom;




Cela dit, s'il s'agit juste de connaître le nom des adhérents d'au moins
une des trois dernières années, on peut écrire :

SELECT DISTINCT T1.Titre, T1.[Prénom], T1.Nom, T1.Adresse1, T1.Adresse2,
T1.[Code Postal], T1.Ville, T1.[retraité]
FROM [adhérents] AS T1 INNER JOIN [adhésion] AS T2
ON T1.refadherent = T2.refadherent
WHERE T1.[retraité]=True AND T2.[année]> 09 AND
T2.[année])< 11
ORDER BY T1.Nom;

S'il s'agit par contre de connaître le nom des gens qui ont été
adhérents les trois dernières années (qui ont payé les trois dernières
cotisations, quoi), on écrira plutôt :

SELECT T1.Titre, T1.[Prénom], T1.Nom, T1.Adresse1, T1.Adresse2,
T1.[Code Postal], T1.Ville, T1.[retraité]
FROM [adhérents] AS T1 INNER JOIN [adhésion] AS T2
ON T1.refadherent = T2.refadherent
WHERE T1.[retraité]=True AND T2.[année]> 09 AND
T2.[année])< 11
GROUP BY T1.Titre, T1.[Prénom], T1.Nom, T1.Adresse1, T1.Adresse2,
T1.[Code Postal], T1.Ville, T1.[retraité]
HAVING Count(T2.[Année])=3
ORDER BY T1.Nom;


db
Avatar
Post Scriptum
"db" a écrit dans le message de news:
4d581be0$0$11042$
Le 13/02/2011 18:35, Michel__D a écrit :

Normalement le SQL suivant devrait fournir le même résultat :

SELECT T1.Titre, T1.[Prénom], T1.Nom, T1.Adresse1, T1.Adresse2, T1.[Code
Postal], T1.Ville, T1.[retraité], Max(T2.[année]) AS MaxDeannée
FROM [adhérents] AS T1 INNER JOIN [adhésion] AS T2 ON T1.refadherent >> T2.refadherent
GROUP BY T1.Titre, T1.[Prénom], T1.Nom, T1.Adresse1, T1.Adresse2,
T1.[Code Postal], T1.Ville, T1.[retraité]
HAVING T1.[retraité]=True AND Max(T2.[année])> 09 AND
Max(T2.[année])< 11
ORDER BY T1.Nom;




Cela dit, s'il s'agit juste de connaître le nom des adhérents d'au moins
une des trois dernières années, on peut écrire :

SELECT DISTINCT T1.Titre, T1.[Prénom], T1.Nom, T1.Adresse1, T1.Adresse2,
T1.[Code Postal], T1.Ville, T1.[retraité]
FROM [adhérents] AS T1 INNER JOIN [adhésion] AS T2
ON T1.refadherent = T2.refadherent
WHERE T1.[retraité]=True AND T2.[année]> 09 AND
T2.[année])< 11
ORDER BY T1.Nom;

S'il s'agit par contre de connaître le nom des gens qui ont été adhérents
les trois dernières années (qui ont payé les trois dernières cotisations,
quoi), on écrira plutôt :

SELECT T1.Titre, T1.[Prénom], T1.Nom, T1.Adresse1, T1.Adresse2,
T1.[Code Postal], T1.Ville, T1.[retraité]
FROM [adhérents] AS T1 INNER JOIN [adhésion] AS T2
ON T1.refadherent = T2.refadherent
WHERE T1.[retraité]=True AND T2.[année]> 09 AND
T2.[année])< 11
GROUP BY T1.Titre, T1.[Prénom], T1.Nom, T1.Adresse1, T1.Adresse2,
T1.[Code Postal], T1.Ville, T1.[retraité]
HAVING Count(T2.[Année])=3
ORDER BY T1.Nom;



J'ai essayé les deux, mais elles me donnent un message d'erreur.
L'important c'est que la première fonctionne avec la condition MAX.
Merci à tout les deux.
Avatar
db
Le 13/02/2011 20:36, Post Scriptum a écrit :


J'ai essayé les deux, mais elles me donnent un message d'erreur.
L'important c'est que la première fonctionne avec la condition MAX.
Merci à tout les deux.




Effectivement, il y avait une parenthèse en trop dans chacune des requêtes.
Mille excuses.

db

SELECT DISTINCT T1.Titre, T1.[Prénom], T1.Nom, T1.Adresse1, T1.Adresse2,
T1.[Code Postal], T1.Ville, T1.[retraité]
FROM [adhérents] AS T1 INNER JOIN [adhésion] AS T2
ON T1.refadherent = T2.refadherent
WHERE T1.[retraité]=True AND T2.[année]> 09 AND
T2.[année]< 11
ORDER BY T1.Nom;


SELECT T1.Titre, T1.[Prénom], T1.Nom, T1.Adresse1, T1.Adresse2,
T1.[Code Postal], T1.Ville, T1.[retraité]
FROM [adhérents] AS T1 INNER JOIN [adhésion] AS T2
ON T1.refadherent = T2.refadherent
WHERE T1.[retraité]=True AND T2.[année]> 09 AND
T2.[année]< 11
GROUP BY T1.Titre, T1.[Prénom], T1.Nom, T1.Adresse1, T1.Adresse2,
T1.[Code Postal], T1.Ville, T1.[retraité]
HAVING Count(T2.[année])=3
ORDER BY T1.Nom;
Avatar
Freeman
Le 13/02/2011 21:09, db a écrit :
Le 13/02/2011 20:36, Post Scriptum a écrit :


J'ai essayé les deux, mais elles me donnent un message d'erreur.
L'important c'est que la première fonctionne avec la condition MAX.
Merci à tout les deux.




Effectivement, il y avait une parenthèse en trop dans chacune des requêtes.
Mille excuses.

db

SELECT DISTINCT T1.Titre, T1.[Prénom], T1.Nom, T1.Adresse1, T1.Adresse2,
T1.[Code Postal], T1.Ville, T1.[retraité]
FROM [adhérents] AS T1 INNER JOIN [adhésion] AS T2
ON T1.refadherent = T2.refadherent
WHERE T1.[retraité]=True AND T2.[année]> 09 AND
T2.[année]< 11
ORDER BY T1.Nom;


SELECT T1.Titre, T1.[Prénom], T1.Nom, T1.Adresse1, T1.Adresse2,
T1.[Code Postal], T1.Ville, T1.[retraité]
FROM [adhérents] AS T1 INNER JOIN [adhésion] AS T2
ON T1.refadherent = T2.refadherent
WHERE T1.[retraité]=True AND T2.[année]> 09 AND
T2.[année]< 11
GROUP BY T1.Titre, T1.[Prénom], T1.Nom, T1.Adresse1, T1.Adresse2,
T1.[Code Postal], T1.Ville, T1.[retraité]
HAVING Count(T2.[année])=3
ORDER BY T1.Nom;



J'ai essayé la première, ça fonctionne, que va m'apporter la seconde ?
Merci.
Il a trouvé un espace en trop à [T1Code Postal]
J'ai rectifié tout seul comme un grand.
Si j'enlevais MAX ça marcherait quand même?
Cette requête n'est pas un appelle à coti, mais une information a faire
pour fêter un anniversaire.
1 2