AFAIK, le (+) La notation n'est présente que pour la rétrocompatibilité, car Oracle l'a lancée avant la mise en place de la norme ANSI pour les jointures. Il est spécifique à Oracle et vous devez éviter de l'utiliser dans un nouveau code lorsqu'une version équivalente conforme aux normes est disponible.
Il semble qu'il y ait des différences entre les deux, et le (+) La notation a des restrictions que la syntaxe de jointure ANSI n'a pas. Oracle lui-même recommande de ne pas utiliser le (+) notation.Description complète ici dans Oracle® Database SQL Language Reference11g Release 1 (11.1) :
Oracle vous recommande d'utiliser le
FROMclauseOUTER JOINplutôt que l'opérateur de jointure Oracle. Requêtes de jointure externe qui utilisent l'opérateur de jointure Oracle(+)sont soumis aux règles et restrictions suivantes, qui ne s'appliquent pas auFROMclauseOUTER JOINsyntaxe :
- Vous ne pouvez pas spécifier le
(+)opérateur dans un bloc de requête qui contient égalementFROMsyntaxe de jointure de clause.- Le
(+)l'opérateur ne peut apparaître que dansWHEREclause ou, dans le contexte de la corrélation à gauche (lors de la spécification de laTABLEclause) dans leFROMclause, et ne peut être appliquée qu'à une colonne d'une table ou d'une vue.- Si A et B sont joints par plusieurs conditions de jointure, vous devez utiliser le
(+)opérateur dans toutes ces conditions. Si vous ne le faites pas, Oracle Database renverra uniquement les lignes résultant d'une jointure simple, mais sans avertissement ni erreur vous informant que vous n'avez pas les résultats d'une jointure externe.- Le
(+)ne produit pas de jointure externe si vous spécifiez une table dans la requête externe et l'autre table dans une requête interne.- Vous ne pouvez pas utiliser le
(+)opérateur de jointure externe d'une table à elle-même, bien que les auto-jointures soient valides.Par exemple, l'instruction suivante n'est pas valide :
SELECT employee_id, manager_id FROM employees WHERE employees.manager_id(+) = employees.employee_id;Cependant, l'auto-jointure suivante est valide :
SELECT e1.employee_id, e1.manager_id, e2.employee_id FROM employees e1, employees e2 WHERE e1.manager_id(+) = e2.employee_id;
- Le
(+)L'opérateur ne peut être appliqué qu'à une colonne, pas à une expression arbitraire. Cependant, une expression arbitraire peut contenir une ou plusieurs colonnes marquées du(+)opérateur.- Un
WHEREcondition contenant le(+)l'opérateur ne peut pas être combiné avec une autre condition en utilisant leORopérateur logique.- Un
WHEREla condition ne peut pas utiliser leINcondition de comparaison pour comparer une colonne marquée du(+)opérateur avec une expression.Si le
WHEREla clause contient une condition qui compare une colonne de la table B avec une constante, puis le(+)L'opérateur doit être appliqué à la colonne afin qu'Oracle renvoie les lignes de la table A pour lesquelles il a généré des valeurs NULL pour cette colonne. Sinon, Oracle ne renvoie que les résultats d'une jointure simple.Dans une requête qui effectue des jointures externes de plus de deux paires de tables, une seule table peut être la table générée par NULL pour une seule autre table. Pour cette raison, vous ne pouvez pas appliquer le
(+)opérateur aux colonnes de B dans la condition de jointure pour A et B et la condition de jointure pour B et C. Reportez-vous àSELECTpour la syntaxe d'une jointure externe.