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 14/07/2019 21:08:47

databaser
Membre

LEFT OUTER JOIN, WHERE et un POSIX

Bonjour,

Prise de tête avec un LEFT OUTER JOIN dont le résultat ne contenait pas toutes les lignes de la table de gauche. C'est la condition : WHERE c.CP ~ '^76';
qui posait problème. Néanmoins, pourriez-vous m'expliquer pourquoi ?
Je cherchais à joindre deux tables au moyen du CP, la table ne gauche ne contient que des 76... et la droite d'autres départements d'où la condition qui doit signifier "parmi les CP commençant par 76". Ai-je faux à la condition ? Sinon, qu'est-ce ?
Merci, smile

Hors ligne

#2 14/07/2019 21:29:01

rjuju
Administrateur

Re : LEFT OUTER JOIN, WHERE et un POSIX

Bonjour,

Je n'ai personnellement rien compris.  Pourriez-vous produire un exemple de requête avec la définition des tables ?

Hors ligne

#3 14/07/2019 21:55:28

databaser
Membre

Re : LEFT OUTER JOIN, WHERE et un POSIX

 SELECT DISTINCT f.CP1, c.CP
FROM BDD.T1 f LEFT OUTER JOIN BDD.T2 c ON f.CP1 = c.CP
ORDER BY f.CP1
WHERE c.CP ~ '^76'; 

T1 : table dont je veux vérifier les CP au moyen de T2. T1 contient les CP : CP1, et les noms des communes NOM
T2 : table comprenant les CP des communes de France et le nom des communes : contient CP : CP, et les noms des communes : NOMCOM

Le résultat de la requête est différent si je retire la condition WHERE. Pourquoi ? WHERE c.CP ~ '^76' signifie : les CP commençant par 76 dans T2, non ? Merci smile

Hors ligne

#4 14/07/2019 22:36:56

rjuju
Administrateur

Re : LEFT OUTER JOIN, WHERE et un POSIX

WHERE c.CP ~ '^76' signifie : les CP commençant par 76 dans T2, non ?

Cela signifie les CP non NULL commençant par 76 dans T2.  Étant donné que c.cp provient d'un left join, cela va mécaniquement supprimer toutes les lignes de t1 n'ayant pas d'enregistrement de t2 associés.  Vous pouvez passer le prédicat c.cp ~ '^76' dans la condition de jointure pour votre besoin.

Hors ligne

#5 19/08/2019 17:09:13

databaser
Membre

Re : LEFT OUTER JOIN, WHERE et un POSIX

Euh... T1 est la table de gauche donc toutes les lignes de T1 sont gardées et si elles n'ont pas de correspondance dans T2, les cellules prennent la valeur NULL, non ?

Oui, en passant le c.CP ~ '^76'  dans le FROM, le problème est résolu. Mon exemple n'était pas très pertinent puisque ça ne sert à rien d'indiquer que la CP commence par 76!! big_smile La requête est plus pertinente lorsqu'il s'agit de chercher des noms de communes dans T2 avec la condition de jointure c.CP commençant par 76 car des noms de communes peuvent être identiques tout en se trouvant dans différents départements.
Merci smile

Je veux bien la différence entre un LEFT JOIN et un OUTER LEFT JOIN ? Merci smile

Dernière modification par databaser (19/08/2019 17:10:01)

Hors ligne

#6 19/08/2019 21:03:04

dverite
Membre

Re : LEFT OUTER JOIN, WHERE et un POSIX

Je veux bien la différence entre un LEFT JOIN et un OUTER LEFT JOIN ?

Il n'y a pas de différence entre T1 LEFT JOIN T2 et T1 LEFT OUTER JOIN T2, de même qu'il n'y a pas de différence entre T1 JOIN T2 et T1 INNER JOIN T2. Pareil pour RIGHT JOIN versus RIGHT OUTER JOIN.

Les mots OUTER et INNER sont optionnels parce que quand il y a LEFT ou RIGHT (ou FULL) c'est forcément une jointure externe, et quand il n'y a ni LEFT ni RIGHT c'est forcément une jointure interne.

Dernière modification par dverite (19/08/2019 21:05:48)

Hors ligne

Pied de page des forums