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 ?
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 ?
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
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 à laFROM
clauseOUTER JOIN
la syntaxe :
- Vous ne pouvez pas spécifier le
(+)
dans un bloc de requête qui contient égalementFROM
syntaxe de jointure de la clause.- Le site
(+)
ne peut apparaître que dans leWHERE
ou, dans le contexte de la corrélation à gauche (en spécifiant la clauseTABLE
) dans leFROM
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érateurOR
opérateur logique.- A
WHERE
ne peut pas utiliser la conditionIN
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 rubriqueSELECT
pour la syntaxe d'une jointure externe.
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".
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.
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.
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
.
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 :
b.id = a.id (+) AND c.id = a.id (+)
n'est pas une clause acceptable)
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
@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
.
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 .
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 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.
42 votes
(+) est plus difficile à comprendre :)
2 votes
Voir Joints externes Syntaxe Oracle vs ANSI