cs_observatoire
Messages postés75Date d'inscriptionvendredi 10 mars 2006StatutMembreDernière intervention23 août 2006
-
7 juin 2006 à 17:40
cs_observatoire
Messages postés75Date d'inscriptionvendredi 10 mars 2006StatutMembreDernière intervention23 août 2006
-
8 juin 2006 à 12:05
Bonjour,
je créé une interface utilisateur, depuis déjà un moment, qui créé des requêtes SQL, et je me rend compte seulement maintenant que j'ai des résultats abérants : lorsque que je fais un compte sur une variable il me multiplie le nombre de lignes de ma 1re table par le nombre de lignes de la table jointe. J'ai entendu parler d'une instruction "DISTINCT", mais je ne sais pas vraiment comment l'utiliser dans mon cas, et si elle résoudra tous les problèmes de "comptes". Mon code est du type :
SELECT Tab2.Var2, Tab1.Var3, Tab4.Var4, Count(*) AS Compte
FROM ((Tab1 INNER JOIN Tab2 ON Tab1.Var2 = Tab2.Var2)
INNER JOIN Tab3 ON Tab1.Var1 = Tab3.Var1
INNER JOIN Tab4 ON Tab1.Var4= Tab4.Var4)
IN 'C:\fichier.mdb'
WHERE ((Tab3.Var1)='critère1')
GROUP BY Tab2.Var2, Tab1.Var3, Tab4.Var4
HAVING (((Tab2.Var2)='critère2') AND ((Tab1.Var3)=critère3))<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
cs_observatoire
Messages postés75Date d'inscriptionvendredi 10 mars 2006StatutMembreDernière intervention23 août 2006 8 juin 2006 à 12:05
Bonjour,
Pour répondre à ta question Moustachu, ça reviendrait effectivement presque au même de mettre ce qui est dans le HAVING dans le WHERE, seulement je veux afficher toutes les variables de critère dans ma requête.
Et je tiens à préciser que ce n'est pas du tout le "INNER JOIN" qui est en cause, du coup le remplacer par "WHERE" ne change pas grand chose à mes résultats.
J'ai finalement idenfié d'où vient mon problème : la table Tab3 que je joins à Tab1, n'est pas jointe sur une clé primaire, ce qui me dédouble forcément toutes mes lignes, j'ai donc créé une autre requête SQL qui affiche Var3 comme une clé primaire, grâce à SELECT DISTINCT, et j'intègre directement cette requête SQL à ma requête princaple :
sql1 = "SELECT DISTINCT Var3, Var4 FROM Tab3 IN 'C:\fichier.mdb' "
MonSql = "SELECT "
MonSql = MonSql & "Tab1.Var1, Tab2.Var2, Alias.Var4, count(*) as Compte " MonSql MonSql & "FROM (Tab1 INNER JOIN (" & sql1 & ") as Alias ON Tab1.Var3 Alias.Var3) MonSql MonSql & "INNER JOIN Tab2 ON Tab1.Var1 Tab2.Var1 "
MonSql = MonSql & "IN 'C:\fichier.mdb' "
MonSql = MonSql & "GROUP BY Tab1.Var1, Tab2.Var2, Alias.Var4 "
MonSql = MonSql & "HAVING (((Tab2.Var2)='critère2') AND ((Tab1.Var3)=critère3));"<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /?>
Observatoire
cs_moustachu
Messages postés1079Date d'inscriptionjeudi 14 novembre 2002StatutMembreDernière intervention 1 janvier 2012 8 juin 2006 à 08:40
Bonjour,
Ta jointure doit être encomplète.
Essaye une requête, peut être moins "jolie" :
SELECT Tab2.Var2, Tab1.Var3, Tab4.Var4, Count(*) AS Compte
FROM Tab1, Tab2, Tab3, Tab4
where Tab1.Var2 = Tab2.Var2 and
Tab1.Var1 = Tab3.Var1 and
Tab1.Var4= Tab4.Var4 and
Tab3.Var1='critère1'
)
IN 'C:\fichier.mdb'
GROUP BY Tab2.Var2, Tab1.Var3, Tab4.Var4
HAVING (((Tab2.Var2)='critère2') AND ((Tab1.Var3)=critère3))<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
Simple curiosité, les critères du HAVING ne peuvent pas être placés dans le WHERE ?