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 28/07/2011, 16h08   #1
Invité régulier
 
Inscription : janvier 2007
Messages : 19
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 19
Points : 5
Points : 5
Par défaut Ligne manquante dans requête sélection

Bonjour à tous,
Je reviens vers vous avec ma bdd de chevaux de course. J'ai écrit une requête qui me semblait pourtant simple mais qui ne marche pas. Une requête "Partants" avec deux champs [N° PMU] et [Nom] listant les partants d'une course. Une deuxième table "Performances" listant les performances passées de tous ces chevaux et dont je veux extraire certaines données sur l'année passé, par exemple les dates des performances. J'ai donc écrit:

Code :
1
2
3
4
5
SELECT DISTINCT Partants.[N° PMU_jour], Partants.Nom, Performances.Date
FROM Partants LEFT JOIN Performances ON Partants.Nom = Performances.Nom
GROUP BY Partants.[N° PMU_jour], Partants.Nom, Performances.Date
HAVING (((Performances.Date) Between ([Formulaires]![EtudeCourse]![Date_jour]-1) And ([Formulaires]![EtudeCourse]![Date_jour]-365)))
ORDER BY Partants.[N° PMU_jour];
Un des concurrents n'a pas de performance enregistrée sur l'année passé mais je souhaite qu'il apparaisse quand même dans le résultat de ma requête avec le champ [Date] vide et il me semblait que ça pouvait se faire sans douleur avec l'aide d'un LEFT JOIN entre les deux tables, mais malgré celà ce concurrent n'apparait toujours pas.
Qu'ai-je donc oublié?
Merci d'avance pour votre aide.
Lanig22 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2011, 16h24   #2
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 474
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 474
Points : 7 560
Points : 7 560
Je pense que c'est ton Having qui l'élimine, essaye en enlevant la condition de sélection et si cela marche, c-à-d que tu obtiens la personne, ajoute une sélection à la sélection or Performances.Date is null

A+
__________________
Vous voulez une réponse rapide et efficace à vos questions téchniques ? Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2011, 16h37   #3
Membre actif
 
Inscription : décembre 2009
Messages : 204
Détails du profil
Informations forums :
Inscription : décembre 2009
Messages : 204
Points : 186
Points : 186
Bonjour,

Si je comprend bien, tu souhaites afficher les chevaux et leurs performances datant d'il y a moins d'un an mais aussi les chevaux n'ayant pas de performances?

Je te conseillerais de faire 3 requêtes :

Q_Performances_Chevaux
Toutes les performances des chevaux

Code :
1
2
3
SELECT DISTINCT Partants.[N° PMU_jour], Partants.Nom, Performances.Date
FROM Partants INNER JOIN Performances ON Partants.Nom = Performances.Nom
WHERE Performances.Date Between [Formulaires]![EtudeCourse]![Date_jour]-1 And [Formulaires]![EtudeCourse]![Date_jour]-365
Et une autre :

Q_Chevaux_sans_performance

Code :
1
2
3
4
5
SELECT [N° PMU_jour], Nom, "" As [Date]
FROM Partants WHERE Nom NOT IN (
   SELECT DISTINCT Nom  FROM Performances
   WHERE Date Between [Formulaires]![EtudeCourse]![Date_jour]-1 And [Formulaires]![EtudeCourse]![Date_jour]-365
   )

Pour afficher ce que tu souhaites :

Code :
1
2
3
4
5
6
7
SELECT * FROM 
Q_Performances_Chevaux
 
UNION ALL
 
SELECT * FROM
Q_Chevaux_sans_performance
tarnx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2011, 17h54   #4
Invité régulier
 
Inscription : janvier 2007
Messages : 19
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 19
Points : 5
Points : 5
Citation:
Envoyé par marot_r Voir le message
Je pense que c'est ton Having qui l'élimine, essaye en enlevant la condition de sélection et si cela marche, c-à-d que tu obtiens la personne, ajoute une sélection à la sélection or Performances.Date is null

A+
Merci pour vos réponses.
Pour marot-r:
Oui, si j'enlève ma condition de date, le concurrent apparait car il a des perfs antérieures à une année en arrière.

Si j'ajoute Or Performances.Date Is Null, ça ne marche pas mieux.

Pour tarnx, je regarde et reviens vers vous.
Lanig22 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2011, 18h05   #5
Invité régulier
 
Inscription : janvier 2007
Messages : 19
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 19
Points : 5
Points : 5
Pour tarnx:

Vous avez bien compris ce que je voulais.
Les deux requêtes sélections fonctionnent bien notamment celle qui sélectionne le cheval sans performance, mais la requête union ne marche pas, ce concurrent reste absent de la liste
Lanig22 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/07/2011, 15h46   #6
Invité régulier
 
Inscription : janvier 2007
Messages : 19
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 19
Points : 5
Points : 5
En effet, c'est la condition sur la date qui pose problème car j'ai ajouté un cheval "Tartenpion" dans ma table "Partants" (et qui n'existe pas dans la table "Performances"), j'ai supprimé la condition sur la date, et là grâce au LEFT JOIN la requête affiche bien Tartenpion avec les autres et un champ date null.

J'ai alors créé une seconde requête toute simple à partir de ma table "Partants" et de la première requête (au résultat incomplet), avec un LEFT JOIN et là ça marche mais si quelqu'un a une idée afin d'éviter de dédoubler la requête je suis preneur.
Lanig22 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/07/2011, 10h53   #7
Expert Confirmé Sénior
 
Avatar de f-leb
 
Homme Fabien
Enseignant
Inscription : janvier 2009
Messages : 2 415
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 415
Points : 4 446
Points : 4 446
bonjour,

effectivement c’est peut-être le même problème qu’ici

… et comme toi je procèderais bien en deux temps, par contre je ne vois pas bien l’utilité de tous ces DISTINCT et GROUP BY…

1 ère requête R1 :
Code sql :
1
2
3
SELECT P.Nom, P.[Date]
FROM Performances P
WHERE P.[Date]  BETWEEN ([Formulaires]![EtudeCourse]![Date_jour]-1) AND ([Formulaires]![EtudeCourse]![Date_jour]-365)))

Puis la requête finale :
Code sql :
1
2
SELECT Partants.[N° PMU_jour], Partants.Nom, R1.Date
FROM Partants LEFT JOIN R1 ON Partants.Nom = R1.Nom

Tu peux les imbriquer si tu préfères :
Code sql :
1
2
3
4
5
6
7
8
SELECT Partants.[N° PMU_jour], Partants.Nom, R1.Date
FROM Partants LEFT JOIN
(
   SELECT P.Nom, P.[Date]
   FROM Performances P
   WHERE P.[Date]  Between ([Formulaires]![EtudeCourse]![Date_jour]-1) And     ([Formulaires]![EtudeCourse]![Date_jour]-365)))
) as R1
ON Partants.Nom = R1.Nom

f-leb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/07/2011, 11h51   #8
Invité régulier
 
Inscription : janvier 2007
Messages : 19
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 19
Points : 5
Points : 5
Merci beaucoup f-leb, la requête imbriquée finale fonctionne parfaitement.
En effet j'ai tendance à mettre des DISTINCT et des GROUP BY un peu trop systématiquement même quand il n'y a pas besoin. J'ai corrigé tout çà dans mon projet.
Lanig22 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 14h00.


 
 
 
 
Partenaires

Hébergement Web