75 votes

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

Quelle est la différence entre utiliser la notation plus d'oracle (+) par rapport à la norme ansi join la notation ?

Y a-t-il une différence dans les performances ?

La notation plus est-elle dépréciée ?

42 votes

(+) est plus difficile à comprendre :)

2 votes

99voto

nagul Points 1469

AFAIK, le (+) n'est présente que pour des raisons de rétrocompatibilité, car Oracle l'a introduite avant la mise en place de la norme ANSI pour les jointures. Elle est spécifique à Oracle et vous devez éviter de l'utiliser dans un nouveau code lorsqu'il existe une version équivalente conforme aux normes.

Il semble qu'il y ait des différences entre les deux, et la (+) a des restrictions que la syntaxe de jointure ANSI n'a pas. Oracle lui-même recommande de ne pas utiliser la notation (+) la notation. Description complète ici dans le Référence du langage SQL d'Oracle® Database 11g version 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 à la FROM clause OUTER JOIN la syntaxe :

  • Vous ne pouvez pas spécifier le (+) dans un bloc de requête qui contient également FROM syntaxe de jointure de la clause.
  • Le site (+) ne peut apparaître que dans le WHERE ou, dans le contexte de la corrélation à gauche (en spécifiant la clause TABLE ) dans le FROM et ne peut être appliquée qu'à une colonne d'une table ou d'une vue.
  • Si A et B sont joints par des conditions de jointure multiples, vous devez utiliser la fonction (+) opérateur dans toutes ces conditions. Si vous ne le faites pas, la base de données Oracle ne renverra que les lignes résultant d'une jointure simple, mais sans avertissement ni erreur pour vous indiquer que vous n'avez pas les résultats d'une jointure externe.
  • Le site (+) 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 (+) pour joindre extérieurement une table à elle-même, bien que les auto-jointures soient valides.

Par exemple, la déclaration suivante n'est pas valable :

SELECT employee_id, manager_id
FROM employees
WHERE employees.manager_id(+) = employees.employee_id;

Cependant, l'auto-jonction suivante est valable :

SELECT e1.employee_id, e1.manager_id, e2.employee_id
FROM employees e1, employees e2
WHERE e1.manager_id(+) = e2.employee_id;
  • Le site (+) ne peut être appliqué qu'à une colonne, et non à une expression arbitraire. Toutefois, une expression arbitraire peut contenir une ou plusieurs colonnes marquées par l'opérateur (+) opérateur.
  • A WHERE condition contenant le (+) ne peut pas être combinée avec une autre condition en utilisant l'opérateur OR opérateur logique.
  • A WHERE ne peut pas utiliser la condition IN condition de comparaison pour comparer une colonne marquée de l'icône (+) avec une expression.

Si le WHERE contient une condition qui compare une colonne du tableau B avec une constante, alors la clause (+) doit être appliqué à la colonne pour que Oracle renvoie les lignes de la table A pour lesquelles il a généré des nuls pour cette colonne. Sinon, Oracle renvoie uniquement 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 nulle pour une seule autre table. Pour cette raison, vous ne pouvez pas appliquer la méthode (+) aux colonnes de B dans la condition de jointure de A et B et dans la condition de jointure de B et C. Reportez-vous à la rubrique SELECT pour la syntaxe d'une jointure externe.

0 votes

Docs.oracle.com/cd/B19306_01/server.102/b14200/queries006.ht‌​m

13voto

Tony Miller Points 6521

La notation est toujours supportée depuis Oracle 10 (et je crois 11). Son utilisation est considérée comme "démodée", et n'est pas aussi portable dans les bases de données que la syntaxe ANSI JOIN. Elle est également considérée comme beaucoup moins lisible, bien que si vous venez d'un milieu +, il vous faudra un peu de temps pour vous habituer à ANSI JOIN. Ce qu'il faut savoir avant de lancer des piques à Oracle, c'est qu'ils ont développé leur syntaxe + avant que le comité ANSI n'ait terminé les définitions des jointures.

Il n'y a pas de différence de performance ; ils expriment la même chose.

Edit : Par "pas aussi portable" j'aurais dû dire "seulement supporté par Oracle SQL".

13 votes

Sachez toutefois qu'il y a eu un certain nombre de bogues où l'optimiseur Oracle a généré des plans de requête incorrects ou des résultats incorrects lorsque la syntaxe ANSI était utilisée. Ce problème est beaucoup moins fréquent dans la version 11.1 que dans les versions 10.1 ou 10.2, mais il s'est produit assez souvent et a brûlé suffisamment de personnes qui avaient adopté la syntaxe ANSI à un stade précoce pour que de larges pans de la communauté Oracle hésitent à adopter la syntaxe ANSI.

6 votes

J'ai un exemple où vous êtes encore obligé d'utiliser l'ancienne syntaxe de jointure d'Oracle : Si vous créez une MATERIALIZED VIEW con FAST REFRESH vous ne pouvez pas utiliser la syntaxe ANSI. Je viens de vérifier la page Oracle concernant ce problème, il est toujours présent. Oracle ne considère pas cela comme un bogue ! Voir Oracle Doc ID 1372720.1 pour plus de détails, au cas où vous auriez accès au support Oracle.

1 votes

Je viens de changer un LEFT OUTER JOIN a la (+) et la requête est passée de 1 minute à 600 milisecondes. mêmes résultats exacts, même plan d'explication dans TOAD. Je ne suis vraiment pas sûr de la partie "pas de différence de performance" ... et nous exécutons 11.2.0.3.0 .

13voto

Vincent Malgrat Points 42899

Je suis d'accord avec la réponse de Tony Miller et j'aimerais ajouter qu'il y a aussi quelques choses que vous ne pouvez PAS faire avec le (+) synthax :

  • Vous ne pouvez pas faire de FULL OUTER JOIN deux tables, vous devez le faire manuellement avec un UNION ALL de deux jointures,
  • Il n'est pas possible d'effectuer une OUTER JOIN d'une table à deux ou plusieurs tables, il faut créer manuellement une sous-requête (par exemple, une sous-requête d'une table à une autre) : b.id = a.id (+) AND c.id = a.id (+) n'est pas une clause acceptable)

0 votes

Que diriez-vous d'une chaîne de jointures extérieures, comme ceci, a.b_id = b.id (+) AND b.c_id = c.id (+) J'ai hérité de quelque chose comme ça et je m'interroge sur ce qui est vraiment renvoyé si le a b La jointure est nulle

0 votes

@Dan Vous pouvez enchaîner des jointures externes "à l'ancienne". A -> B -> C sans problème. Les mêmes règles que pour les raccords ANSI standard s'appliquent : Une chaîne de jointures externes est rompue si l'un de ses maillons est une jointure régulière. En d'autres termes A LEFT JOIN B INNER JOIN C est équivalent à A JOIN B JOIN C .

2voto

abhishek Points 19

Notation Oracle (+) n'est utilisé que dans Oracle, qui est spécifique au fournisseur . Et, Notation jointe normalisée ANSI peut être utilisé dans n'importe quel SGBDR (comme Sql Server, MySql etc.) . Sinon, il n'y a pas de différence entre la notation Oracle (+) et la notation Join standardisée ANSI.

Si vous utilisez la notation de jointure standardisée ANSI dans votre requête Sql, vous pouvez utiliser la même requête dans n'importe quel SGBDR. Et, si vous êtes Portage votre base de données d'Oracle à tout autre SGBDR dans cette condition, vous devez utiliser la syntaxe ANSI .

0voto

Ahmedov Points 366

J'utilise la notation (+), car presque toutes les requêtes liées à Oracle Apps r12 sont basées sur celle-ci. Je n'ai pas vu une seule requête SQL avec une expression "join" standard dans les requêtes Oracle APPS (même celles fournies par Oracle lui-même). Si vous ne me croyez pas, il suffit de googler n'importe quelle information relative à Oracle Apps. Par exemple : Requêtes relatives aux immobilisations

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X