Jointure de tables : SELECT DISTINCT [Résolu]

Signaler
Messages postés
75
Date d'inscription
vendredi 10 mars 2006
Statut
Membre
Dernière intervention
23 août 2006
-
Messages postés
75
Date d'inscription
vendredi 10 mars 2006
Statut
Membre
Dernière intervention
23 août 2006
-
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

Messages postés
75
Date d'inscription
vendredi 10 mars 2006
Statut
Membre
Dernière intervention
23 août 2006

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
Messages postés
265
Date d'inscription
dimanche 3 août 2003
Statut
Membre
Dernière intervention
29 mars 2010

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
Messages postés
1079
Date d'inscription
jeudi 14 novembre 2002
Statut
Membre
Dernière intervention
1 janvier 2012

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