Jointure de tables : SELECT DISTINCT

Résolu
cs_observatoire Messages postés 75 Date d'inscription vendredi 10 mars 2006 Statut Membre Dernière intervention 23 août 2006 - 7 juin 2006 à 17:40
cs_observatoire Messages postés 75 Date d'inscription vendredi 10 mars 2006 Statut Membre Dernière intervention 23 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" /?>

3 réponses

cs_observatoire Messages postés 75 Date d'inscription vendredi 10 mars 2006 Statut Membre Dernière intervention 23 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
3
Clad49 Messages postés 265 Date d'inscription dimanche 3 août 2003 Statut Membre Dernière intervention 29 mars 2010
8 juin 2006 à 01:01
Salut !

DISTINCT permet de ne pas affichier les doublon, du genre :

tu as une table avec :

Nom               prenom
Durant            Paul
Dupont           Charle
Durant            Soso
Foular            Henry

si tu fait une requette pour affichier les noms et que tu veut tout les nom sans les doublon tu rajoute DISTINC nom et il affichera :

Durant - Dupont - Foular

Mais je ne pence pas que ca puisse vraiment corriger ton problème !

Clad
0
cs_moustachu Messages postés 1079 Date d'inscription jeudi 14 novembre 2002 Statut Membre Derniè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 ?

++ Moustachu
0