[ACCESS] Problème infinité des même résultats d'une Requêtes

Problème infinité des même résultats d'une Requêtes [ACCESS] - SQL/NoSQL - Programmation

Marsh Posté le 07-08-2013 à 12:19:36    

Bonjour à tous,
Je suis un petit nouveau dans la programmation en SQL et notamment à l'usage d'Access.
J'aimerai réalisé une application de chronométrage. Et voici mes dispositions :
J'ai crée 5 tables (Participants 65 km, Participants 100 km, Equipe 65 km et Equipe 100 km, Start/Finish), les 4 premières table contiennent 4 champs (Dossard, Nom, Prénom, Année)
Et Start/Finish contient les champs : dossard (de 1 à 1599), start et finish
Ma clé primaire étant le Dossard, cela permet de relié toutes les tables. (Participants 65 km : Dossard de 1 à 699, Participants 100 km, Dossard de 1000 à 1299, Equipe 65 km : Dossard de 900 à 999 et Equipe 100 km : Dossard de 1500 à 1599)  
 
Je voudrai entrer une valeur du numéro de dossard, et la requête m'afficherait le dossard, le nom et le prénom de la personne et son temps et ça peut importe les tables.  
J'y suis arrivé, le soucis c'est que j'obtiens bien le bon résultat (Dossard, personne + les temps) mais je l'obtiens des centaines de fois à la suite l'un de l'autre.  
Et je ne vois pas du tout ou se situe le problème, si qqn aurait envie de jeter un coup d'oeil, il me rendrait un grand service !  
 
J'espère avoir été le plus clair possible,
Merci d'avance,
Pauly07
 
Voici mon code :  
 
SELECT [Start/Finish].Dossard, (IIf(([Start/Finish].Dossard<700),([Participants 65 km].Nom),IIf((([Start/Finish].Dossard>899) And ([Start/Finish].Dossard<1000)),([Equipe 65 km].[Nom]),IIf((([Start/Finish].Dossard>999) And ([Start/Finish].Dossard<1300)),([Participants 100 km].Nom),([Equipe 100 km].[Nom]))))) AS Nom, (IIf(([Start/Finish].Dossard<700),([Participants 65 km].Prénom),IIf((([Start/Finish].Dossard>899) And ([Start/Finish].Dossard<1000)),([Equipe 65 km].[Prénom]),IIf((([Start/Finish].Dossard>999) And ([Start/Finish].Dossard<1300)),([Participants 100 km].Prénom),([Equipe 100 km].[Prénom]))))) AS Prénom, [Start/Finish].Start, [Start/Finish].Finish
 
FROM [Equipe 65 km], [Equipe 100 km], [Participants 100 km], [Start/Finish], [Participants 65 km]
 
WHERE ((([Start/Finish].Dossard)=[Entrez un numéro de Dossard]) AND ([Start/Finish].Dossard=[Participants 65 km].Dossard OR [Start/Finish].Dossard=[Participants 100 km].Dossard OR [Start/Finish].Dossard=[Equipe 65 km].Dossard OR [Start/Finish].Dossard=[Equipe 100 km].Dossard));
 

Reply

Marsh Posté le 07-08-2013 à 12:19:36   

Reply

Marsh Posté le 07-08-2013 à 14:23:01    

Je ne dirais qu'une chose : [:jeebus]
- Tables avec des noms pas normalisés (ie, sur aucun autre SGBD une table avec un nom contenant des espaces passerait)
- des IIF() dans le select alors que ça pourrait probablement être dans le where ou la clause having
- des OR dans le where en veux-tu en voilà, pas mieux pour te pourrir les perfs (bon, cela dit, parler de perfs avec Access  :whistle: )
 
Un conseil : construit toi-même ta BD avec des tables biens normalisées (je pense aussi aux relations entre les données => voir la forme 3NF de Codd) puis écris tes requêtes SQL, ça sera bien plus propre et surtout, bien plus maintenable :/
 
T'as 4 tables ayant la même structure -> t'en fait 1 seule avec un champ en plus qui contient la distance. Rien que ça, tu vois déjà que ça sera bien plus pratique si tu dois introduire une distance supplémentaire. Tu vas pas faire une table pour une seule distance :sarcastic:


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 07-08-2013 à 17:20:13    

Merci d'avoir répondu aussi vite et pour les différents conseils  
J'avoue que le code n'est pas léger léger xD
Je vais tester avec la clause having voir si je peux réunir toutes les conditions et abandonner par la même occasion le connecteur OR.  
J'avais à la base crée 4 tables pour différencier chaque catégories et qu'elles soient indépendantes des une des autres d'où le code. Si je n'y arrive pas, je joindrai le tout en une table (tant pis pour le principe des 4 tables séparées), ça détournera mon problème. Et je n'aurai plus que ceci :
 
SELECT Participants.Dossard, Participants.Nom, Participants.Prénom, [Start/Finish].Start, [Start/Finish].Finish
FROM Participants, [Start/Finish]
WHERE (([Start/Finish].Dossard=[Entrez un numéro de Dossard]) AND ([Start/Finish].Dossard=Participants.Dossard));
 
Encore merci

Reply

Marsh Posté le 07-08-2013 à 17:37:35    

Citation :

tant pis pour le principe des 4 tables séparées


Pas grave, c'était vraiment pas un bon principe. ;) Le partitionnement existe sur bon nombre de SGBD mais c'est juste pour améliorer les perfs (mais là, c'est quand on a des tables de plusieurs millions d'enregistrements) : d'un point de vue logique, le développeur voit 1 seule table, mais physiquement, sur le HDD, y'a plusieurs "sous-tables", le partitionnement se faisant soit en fonction d'une colonne (ça serait ton cas avec la distance qui servirait de critère de partitionnement) soit en fonction d'un nb de lignes (genre, tous les 10 millions de lignes, on fait une nouvelle table physique).


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed