TableA LEFT OUTER JOIN TableB
est équivalent à TableB RIGHT OUTER JOIN Table A
.
Dans Oracle, (+)
désigne la table "facultative" dans le JOIN. Donc dans votre première requête, c'est un P LEFT OUTER JOIN S
. Dans votre deuxième requête, c'est S RIGHT OUTER JOIN P
. Ils sont fonctionnellement équivalents.
Dans la terminologie, RIGHT ou LEFT spécifient quel côté de la jointure a toujours un enregistrement, et l'autre côté peut être nul. Donc dans un P LEFT OUTER JOIN S
, P
aura toujours un enregistrement car il est sur le LEFT
, mais S
pourrait être nul.
Voir cet exemple de java2s.com pour plus d'explications.
Pour clarifier, je suppose que je dis que la terminologie n'a pas d'importance, car elle n'est là que pour aider à visualiser. Ce qui compte, c'est que vous compreniez le concept de son fonctionnement.
DROITE contre GAUCHE
J'ai vu une certaine confusion sur ce qui compte pour déterminer RIGHT vs LEFT dans la syntaxe de jointure implicite.
JOINT EXTERNE GAUCHE
SELECT *
FROM A, B
WHERE A.column = B.column(+)
JOINT EXTERNE DROIT
SELECT *
FROM A, B
WHERE B.column(+) = A.column
Tout ce que j'ai fait, c'est échanger les termes de la clause WHERE, mais ils sont toujours fonctionnellement équivalents. (Voir plus haut dans ma réponse pour plus d'informations à ce sujet.) Le placement du (+)
détermine DROITE ou GAUCHE. (Plus précisément, si le (+)
est à droite, c'est un LEFT JOIN. Si (+)
est sur la gauche, c'est un RIGHT JOIN.)
Types de JOIN
Les deux styles de JOIN sont des JOINs implicites et JOIN explicites . Ce sont différents styles d'écriture de JOIN, mais ils sont fonctionnellement équivalents.
Voir cette question SO .
JOIN implicites répertoriez simplement toutes les tables ensemble. Les conditions de jointure sont spécifiées dans une clause WHERE.
JOINTURE implicite
SELECT *
FROM A, B
WHERE A.column = B.column(+)
JOIN explicites associez les conditions de jointure à l'inclusion d'une table spécifique plutôt qu'à une clause WHERE.
JOINTURE explicite
SELECT *
FROM A
LEFT OUTER JOIN B ON A.column = B.column
Ces JOIN implicites peuvent être plus difficiles à lire et à comprendre, et ils ont également quelques limitations puisque les conditions de jointure sont mélangées dans d'autres conditions WHERE. En tant que tels, les JOIN implicites sont généralement déconseillés en faveur d'une syntaxe explicite.