TableA LEFT OUTER JOIN TableB
est équivalent à TableB RIGHT OUTER JOIN Table A
.
Dans Oracle, (+)
désigne la table "facultative" dans le JOIN. Ainsi, 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écifie quel côté de la jointure a toujours un enregistrement, et l'autre côté peut être nul. Ainsi, dans un P LEFT OUTER JOIN S
, P
aura toujours un enregistrement parce qu'elle est sur le LEFT
mais S
pourrait être nulle.
Ver cet exemple de java2s.com pour des explications supplémentaires.
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 constaté une certaine confusion quant à ce qui compte pour déterminer la DROITE ou la GAUCHE dans la syntaxe de jointure implicite.
JOINTURE EXTERNE GAUCHE
SELECT *
FROM A, B
WHERE A.column = B.column(+)
JOINTURE EXTERNE DROITE
SELECT *
FROM A, B
WHERE B.column(+) = A.column
Je n'ai fait que permuter les côtés des termes dans la clause WHERE, mais ils sont toujours fonctionnellement équivalents. (Voir plus haut dans ma réponse pour plus d'informations à ce sujet). (+)
détermine la DROITE ou la GAUCHE. (Plus précisément, si l'option (+)
est à droite, c'est un LEFT JOIN. Si (+)
est à gauche, c'est un JOINT DROIT).
Types de JOIN
Les deux styles de JOIN sont JOINs implicites y JOINs explicites . Il s'agit de styles différents d'écriture des JOIN, mais ils sont fonctionnellement équivalents.
Ver cette question SO .
JOINs implicites répertorie simplement toutes les tables ensemble. Les conditions de jointure sont spécifiées dans une clause WHERE.
JOIN implicite
SELECT *
FROM A, B
WHERE A.column = B.column(+)
JOINs explicites associer les conditions de jointure à l'inclusion d'une table spécifique plutôt que dans une clause WHERE.
JOIN explicite
SELECT *
FROM A
LEFT OUTER JOIN B ON A.column = B.column
Ces Les JOIN implicites peuvent être plus difficiles à lire et à comprendre, et ils présentent également quelques limitations puisque les conditions de jointure sont mélangées à d'autres conditions WHERE. À ce titre, les JOIN implicites sont généralement déconseillés en faveur de la syntaxe explicite.
29 votes
Vous devez éviter d'utiliser la notation '(+)' et mettre à jour les requêtes pour utiliser des jointures explicites.
3 votes
@JonathanLeffler 100% d'accord. Le problème est que je travaille avec des personnes qui ne veulent pas passer à la notation standard. J'écris de nouvelles requêtes avec la notation standard, mais je serai prêt à tirer dans une minute si une ancienne requête est modifiée.
3 votes
@JonathanLeffler Je suis d'accord, sauf si vous utilisez Oracle. Oracle, tel qu'il est actuellement, ne gère pas la syntaxe ansi aussi bien que l'opérateur (+) en interne. Bien qu'ils recommandent d'utiliser la syntaxe ansi :) docs.oracle.com/cd/B28359_01/server.111/b28286/queries006.htm
7 votes
@Amyth Désolé pour ce commentaire un peu dépassé, mais je suis arrivé à cette question en faisant une recherche. Pour ma part, je comprends les recommandations d'Oracle de manière exactement inverse. D'après votre lien : " Oracle vous recommande d'utiliser la syntaxe FROM clause OUTER JOIN plutôt que l'opérateur de jointure d'Oracle. Les requêtes de jointure externe qui utilisent l'opérateur de jointure Oracle (+) sont soumises aux règles et restrictions suivantes, qui ne s'appliquent pas à la syntaxe FROM clause OUTER JOIN ..."
0 votes
Désolé pour cette réponse dépassée :), mais ce que dit Oracle et la façon dont ses statistiques fonctionnent pour optimiser les requêtes sont deux choses différentes, et il se peut qu'Oracle ait changé de position avec les progrès de ses optimiseurs internes.