Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#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,
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 ?
Julien.
https://rjuju.github.io/
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
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.
Julien.
https://rjuju.github.io/
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!! 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
Je veux bien la différence entre un LEFT JOIN et un OUTER LEFT JOIN ? Merci
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)
@DanielVerite
http://blog-postgresql.verite.pro/
Hors ligne
Pages : 1