PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 10/07/2014 14:11:28

[9.4 beta]resultat étrange jointure ou wehre

Bonjour
J'ai une situation assez étrange pour moi.
La base de données concerne une école (filière, spécialité, cycle, niveau, classe, étudiant, inscription->association entre étudiant et classe). Je voulais avoir la liste d'une classe et je suis un peut surpris du résultat.
Scénario...
I/ avec WHERE
SQL

SELECT 
  tetudiant.leprenom, 
  tetudiant.lenom
FROM 
  public.tinscription, 
  public.tetudiant, 
  public.tclasse, 
  public.tniveau, 
  public.tcycle, 
  public.tannee, 
  public.tspecialite, 
  public.tfiliere
WHERE 
  tetudiant.idetudiant = tinscription.idetudiant AND
  tclasse.idclasse = tinscription.idclasse AND
  tniveau.idniveau = tclasse.idniveau AND
  tcycle.idcycle = tniveau.idcycle AND
  tannee.idannee = tclasse.idannee AND
  tspecialite.idspecialite = tniveau.idspecialite AND
  tfiliere.idfiliere = tspecialite.idfiliere;

sortie...
  "Aoua";"Coulibaly"
"Kadiatou";"Coulibaly"
"Bintou";"Dembélé"
"Fatoumata";"Bagayoko"
"Fanta";"Bouaré"
"Amadou";"Bah"

II/ avec jointure 1ère forme....
SQL....

SELECT 
  tetudiant.leprenom, 
  tetudiant.lenom
from public.tannee inner join 
  public.tclasse on  tannee.idannee = tclasse.idannee
  inner join public.tniveau on  tniveau.idniveau = tclasse.idniveau
  inner join public.tinscription on  tclasse.idclasse = tinscription.idclasse
  inner join public.tcycle on  tcycle.idcycle = tniveau.idcycle
  inner join public.tspecialite on  tspecialite.idspecialite = tniveau.idspecialite
  inner join public.tfiliere on  tfiliere.idfiliere = tspecialite.idfiliere
  inner join public.tetudiant on tetudiant.idetudiant = tinscription.idetudiant

sortie...
"Aoua";"Coulibaly"
"Kadiatou";"Coulibaly"
"Bintou";"Dembélé"
"Fatoumata";"Bagayoko"
"Fanta";"Bouaré"
"Amadou";"Bah"

II/ avec jointure 2ème forme...
SQL

SELECT 
  tetudiant.leprenom, 
  tetudiant.lenom
FROM tinscription
 INNER JOIN tetudiant ON 
 tetudiant.idetudiant = tinscription.idetudiant 
 INNER JOIN tclasse ON 
 tclasse.idclasse = tinscription.idclasse 
 INNER JOIN tniveau ON 
 tniveau.idniveau = tclasse.idniveau 
 INNER JOIN tcycle ON 
 tcycle.idcycle = tniveau.idcycle 
 INNER JOIN tannee ON 
 tannee.idannee = tclasse.idannee 
 INNER JOIN tspecialite ON 
 tniveau.idspecialite = tniveau.idspecialite 
 INNER JOIN tfiliere ON 
 tfiliere.idfiliere = tspecialite.idfiliere

sortie...
"Aoua";"Coulibaly"
"Aoua";"Coulibaly"
"Aoua";"Coulibaly"
"Aoua";"Coulibaly"
"Kadiatou";"Coulibaly"
"Kadiatou";"Coulibaly"
"Kadiatou";"Coulibaly"
"Kadiatou";"Coulibaly"
"Bintou";"Dembélé"
"Bintou";"Dembélé"
"Bintou";"Dembélé"
"Bintou";"Dembélé"
"Fatoumata";"Bagayoko"
"Fatoumata";"Bagayoko"
"Fatoumata";"Bagayoko"
"Fatoumata";"Bagayoko"
"Fanta";"Bouaré"
"Fanta";"Bouaré"
"Fanta";"Bouaré"
"Fanta";"Bouaré"
"Amadou";"Bah"
"Amadou";"Bah"
"Amadou";"Bah"
"Amadou";"Bah"
_____________________________________

Je constate que la deuxième forme de jointure multiplie par 4 le résultat des deux autres.
Avez-vous des explications. Aux besoin, je peux donner le backup (<300KO) en sql de la base.
Merci d'avance.

Hors ligne

#2 20/07/2014 17:26:09

gleu
Administrateur

Re : [9.4 beta]resultat étrange jointure ou wehre

Le fait que les jointures ne sont pas identiques ?

D'un côté:

inner join public.tinscription on  tclasse.idclasse = tinscription.idclasse

et de l'autre

FROM tinscription
INNER JOIN tetudiant ON
tetudiant.idetudiant = tinscription.idetudiant


Guillaume.

Hors ligne

#3 21/07/2014 15:19:18

Re : [9.4 beta]resultat étrange jointure ou wehre

Salut
Merci pour la contribution.
En fait le problème vient de l'avant dernière jointure.

INNER JOIN tspecialite ON 
 tniveau.idspecialite = tniveau.idspecialite 

cela crée une jointure croisée.
Il faut avouer que c'était pas évident de le dénicher. Le problème a été détecter par une autre personne ailleurs.
@+

Dernière modification par alassanediakite (21/07/2014 15:21:02)

Hors ligne

Pied de page des forums