181 votes

Oracle "(+)" Opérateur

Je vérifie quelques anciennes déclarations SQL dans le but de les documenter et probablement de les améliorer.

Le SGBD est Oracle

Je n'ai pas compris une déclaration qui se lit comme ceci :

select ...
from a,b
where a.id=b.id(+)

Je suis confus au sujet de la (+) opérateur, et je n'ai pu l'obtenir sur aucun forum... (la recherche de + entre guillemets n'a pas fonctionné non plus).

Quoi qu'il en soit, j'ai utilisé 'Explain Plan' de SQLDeveloper et j'ai obtenu un résultat disant que HASH JOIN, RIGHT OUTER etc.

Y aurait-il une différence si j'enlevais le (+) à la fin de la requête ? La base de données doit-elle satisfaire à certaines conditions (par exemple, disposer de certains index, etc.) avant que l'opérateur ne puisse être utilisé ? (+) peut être utilisé ? Il serait très utile que vous me fournissiez une explication simple, ou quelques bons liens où je peux lire à ce sujet.

Gracias.

1 votes

Ce n'est pas un opérateur. C'est juste un morceau de syntaxe qui affecte ce que JOIN fait.

1 votes

Oracle le désigne comme un opérateur docs.oracle.com/cd/B28359_01/server.111/b28286/…

0 votes

@malckier Appeler cela un opérateur n'en fait pas un opérateur. Si la documentation était meilleure, peut-être que les gens comprendraient ce qu'il essaie de dire.

213voto

OMG Ponies Points 144785

Il s'agit d'une notation spécifique à Oracle pour une jointure OUTER, car le format ANSI-89 (qui utilise une virgule dans la clause FROM pour séparer les références aux tables) n'a pas normalisé les jointures OUTER.

La requête serait réécrite dans la syntaxe ANSI-92 comme suit :

   SELECT ...
     FROM a
LEFT JOIN b ON b.id = a.id

Ce lien explique très bien la différence entre les JOINs. .


Il convient également de noter que, même si le (+) travaux, Oracle recommande no l'utiliser :

Oracle vous recommande d'utiliser le FROM clause OUTER JOIN plutôt que l'opérateur de jointure d'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 :

91 votes

Tout à fait exact. Pour que le (+) reste clair dans ma tête (côté gauche par rapport au côté droit), j'aime penser au (+) comme à "l'ajout de valeurs NULL si aucune correspondance n'est trouvée". Par exemple, "a.id=b.id(+)" signifie permettre à b.id d'être NULL s'il n'y a pas de correspondance avec a.id.

0 votes

Merci..je suppose que l'ajouter à partir de la clause devrait donner le même résultat !!!

0 votes

Vous pouvez consulter la documentation officielle d'Oracle : docs.oracle.com/html/A95915_01/sqopr.htm

55voto

Dans Oracle, (+) indique la table "optionnelle" dans le JOIN. Donc dans votre requête,

SELECT a.id, b.id, a.col_2, b.col_2, ...
FROM a,b
WHERE a.id=b.id(+)

c'est un LEFT OUTER JOIN de la table 'b' à la table 'a'. Il retournera toutes les données de la table 'a' sans perdre ses données lorsque l'autre côté (la table 'b' facultative) n'a pas de données.

Diagram of Left Outer Join

La syntaxe standard moderne pour la même requête serait la suivante

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
LEFT JOIN b ON a.id=b.id

ou avec un raccourci pour a.id=b.id (non pris en charge par toutes les bases de données) :

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
LEFT JOIN b USING(id)

Si vous supprimez (+), la requête sera une jointure interne normale.

Syntaxe plus ancienne, dans les bases de données Oracle et autres :

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a,b
WHERE a.id=b.id

Une syntaxe plus moderne :

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
INNER JOIN b ON a.id=b.id

Ou simplement :

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
JOIN b ON a.id=b.id

Diagram of Inner Join

Il ne renverra que les données pour lesquelles la valeur 'id' des tables 'a' et 'b' est la même, ce qui signifie qu'il s'agit d'une partie commune.

Si vous voulez que votre requête soit une jointure droite (Right Join)

C'est la même chose qu'un LEFT JOIN, mais le choix de la table est facultatif.

Diagram of Right Outer Join

Vieille syntaxe Oracle :

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a,b
WHERE a.id(+)=b.id

Syntaxe standard moderne :

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
RIGHT JOIN b ON a.id=b.id

Réf. et aide :

https://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:6585774577187

Jointure externe gauche utilisant le signe + dans Oracle 11g

https://www.w3schools.com/sql/sql_join_left.asp

30voto

hot dog Points 91

L'opérateur (+) indique une jointure externe. Cela signifie qu'Oracle renvoie les enregistrements de l'autre côté de la jointure même s'il n'y a pas de correspondance. Par exemple, si a et b sont emp et dept et que vous pouvez avoir des employés non affectés à un département, l'instruction suivante renverra les détails de tous les employés, qu'ils aient été affectés ou non à un département.

select * from emp, dept where emp.dept_id=dept.dept_id(+)

En résumé, la suppression du (+) peut faire une différence significative, mais il se peut que vous ne le remarquiez pas avant un certain temps, en fonction de vos données !

7voto

sunny Points 153

En pratique, le symbole + est placé directement dans l'instruction conditionnelle et du côté de la table optionnelle (celle qui est autorisée à contenir des valeurs vides ou nulles dans la conditionnelle).

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