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

#1 30/08/2012 16:50:39

fr2ed
Membre

jointures avec 10 tables

Bonjour,

J'ai créé une vue à partir de 10 tables.

Ayant utilisé le constructeur graphique de requête de pgAdminIII, j'ai obtenu ceci :

SELECT 
  table1.champ1, 
  table2.champ1, 
  table2.champ2, 
  table3.champ1, 
  table4.champ1, 
  table4.champ2, 
  table4.champ3, 
  table5.champ1, 
  table6.champ1, 
  table7.champ1, 
  table8.champ1, 
  table9.champ1, 
  table10.champ1,
  table10.champ2
FROM 
  public.table2, 
  public.table10, 
  public.table1, 
  public.table8, 
  public.table5, 
  public.table4, 
  public.table3, 
  public.table6, 
  public.table7, 
  public.table9
WHERE 
  table2.champ3 = table1.champ2 AND
  table2.champ4 = table8.champ6 AND
  table2.champ1 = table6.champ1 AND
  table2.champ2 = table7.champ2 AND
  table10.champ2 = table2.champ2 AND
  table8.champ3 = table5.champ2 AND
  table5.champ5 = table4.champ3 AND
  table3.champ4 = table5.champ3

Ça marche parfaitement, mais j'aurais préféré utiliser des JOIN à la place des WHERE, histoire d'optimiser les performances.

Mais impossible de trouver la syntaxe correcte pour les JOIN sur 10 tables !

Merci de votre aide...

Hors ligne

#2 30/08/2012 17:03:07

rjuju
Administrateur

Re : jointures avec 10 tables

Bonjour,

la syntaxe des join est la suivante :

SELECT ...
FROM table1
JOIN table2 ON table1.champ2 = table2.champ3
JOIN table8 ON table8.champ6 = table2.champ4
JOIN ...

Cependant, vous ne gagnerez pas en performance sous postgresql en remplaçant les FROM par des WHERE (vous pouvez comparer les plans d'exécution), sauf éventuellement si vous changez l'ordre des jointures.

Hors ligne

#3 31/08/2012 08:47:36

fr2ed
Membre

Re : jointures avec 10 tables

ok, je crois comprendre d'où vient mon problème : en fait, les JOIN font partie de la section FROM, donc :

- il ne peut pas y avoir la même table dans le FROM et dans les JOIN.

- il ne peut pas y avoir 2 fois la même table dans les JOIN.

- je ne peux pas faire référence à une table dans les ON si elle n'est pas déjà déclarée dans le FROM ou les JOIN.


Vous me confirmez ?

Hors ligne

#4 31/08/2012 09:01:30

gleu
Administrateur

Re : jointures avec 10 tables

Vous pouvez avoir la même table dans le FROM et dans le JOIN, ou dans deux JOIN. Par contre, vous devez donner un alias à au moins une des deux tables pour que PostgreSQL puisse faire la différence.

Par contre, je confirme qu'on ne peut pas faire référence à une table dans la partie ON si elle n'a pas été indiquée dans le FROM ou un JOIN précédent.


Guillaume.

Hors ligne

#5 31/08/2012 09:56:41

fr2ed
Membre

Re : jointures avec 10 tables

Merci ! Les JOIN sont beaucoup, beaucoup plus clair pour moi maintenant.  Et ma requête fonctionne parfaitement smile

Une seule remarque : je suis surpris que le constructeur graphique de pgAdminIII génère du code avec des WHERE !

Bonne journée...

Hors ligne

#6 31/08/2012 10:54:12

gleu
Administrateur

Re : jointures avec 10 tables

Vous voulez dire en n'utilisant pas de JOIN je suppose ? c'est une amélioration qu'on souhaiterait apporter au constructeur graphique. Il est dans la TODO list. Si vous avez des connaissances en C++, n'hésitez pas à proposer un patch.


Guillaume.

Hors ligne

Pied de page des forums