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
FROM
clauseOUTER JOIN
plutô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 auFROM
clauseOUTER JOIN
syntaxe :
- Vous ne pouvez pas spécifier le
(+)
opérateur dans un bloc de requête qui contient égalementFROM
syntaxe de jointure de clause.- Le
(+)
l'opérateur ne peut apparaître que dansWHERE
clause ou, dans le contexte de la corrélation à gauche (lors de la spécification de laTABLE
clause) dans leFROM
clause, 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
WHERE
condition contenant le(+)
l'opérateur ne peut pas être combiné avec une autre condition en utilisant leOR
opérateur logique.- Un
WHERE
la condition ne peut pas utiliser leIN
condition de comparaison pour comparer une colonne marquée du(+)
opérateur avec une expression.Si le
WHERE
la 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 àSELECT
pour la syntaxe d'une jointure externe.