Oracle
 sql >> Base de données >  >> RDS >> Oracle

Différence entre la notation plus (+) d'Oracle et la notation ansi JOIN ?

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 clause OUTER 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 au FROM clause OUTER JOIN syntaxe :

  • Vous ne pouvez pas spécifier le (+) opérateur dans un bloc de requête qui contient également FROM syntaxe de jointure de clause.
  • Le (+) l'opérateur ne peut apparaître que dans WHERE clause ou, dans le contexte de la corrélation à gauche (lors de la spécification de la TABLE clause) dans le FROM 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 le OR opérateur logique.
  • Un WHERE la condition ne peut pas utiliser le IN 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.