Oracle "( + ) " Operator

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 l'opérateur (+) , et ne pouvait l'obtenir à aucun forum... (la recherche de + entre guillemets n'a pas fonctionné non plus).

de toute façon, J'ai utilisé 'expliquer le Plan' de SQLDeveloper et j'ai eu une sortie disant que HASH JOIN, RIGHT OUTER , etc.

y aurait-il une différence si je supprimais l'opérateur (+) à la fin de la requête? La base de données doivent satisfaire à certaines conditions (comme d'avoir quelques indices, etc.) avant (+) peut être utilisé?? Il serait grandement utile si vous pouvez me fournir une compréhension simple, ou quelques bons liens où je peux lire sur ce sujet.

Merci!

128
demandé sur Óscar Gómez Alcañiz 2010-10-26 08:51:14

4 réponses

c'est la notation spécifique Oracle pour une jointure externe, parce que le format ANSI-89 (en utilisant une virgule dans la clause de à séparer les références de table) n'a pas standardisé les jointures externes.

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

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

ce lien est assez bon pour expliquer la différence entre les jointures .


Il convient également de noter que, même bien que le (+) fonctionne, Oracle recommande pas en utilisant :

Oracle recommande d'utiliser la syntaxe FROM clause OUTER JOIN plutôt que L'opérateur de jointure Oracle. Les requêtes externes de jointure qui utilisent L'opérateur de jointure Oracle (+) sont soumises aux règles et restrictions suivantes, qui ne s'appliquent pas à la syntaxe FROM clause OUTER JOIN :

157
répondu OMG Ponies 2016-03-31 18:40:35

l'opérateur (+) indique une jointure extérieure. Cela signifie Qu'Oracle retournera toujours 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 des emp et des dept et que vous pouvez avoir des employés non assignés à un ministère, alors l'énoncé suivant retournera les détails de tous les employés, qu'ils aient été ou non assignés à un ministère.

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

donc en bref, supprimer le (+) peut faire une différence de signification, mais vous pourriez ne pas remarquer pendant un certain temps en fonction de vos données!

24
répondu hot dog 2013-10-22 12:09:16

dans Oracle, (+) indique la table" optionnelle " dans la jointure. 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 une partie externe gauche de la table 'b' avec la table 'a'. Comme dans la requête de gauche moderne. ( il retourne toutes les données de la table 'a' sans perdre ses données de l'autre côté de la table optionnelle 'b' peut perdre ses données ) enter image description here

select  a.id, b.id, a.col_2, b.col_2, ...
from a
Left join b ON a.id=b.id

ou

select  a.id, b.id, a.col_2, b.col_2, ...
from a
Left join b using(id)

maintenant, si vous supprimez ( + ) alors ce sera la requête interne normale de jointure,

select  a.id, b.id, a.col_2, b.col_2, ...
from a,b
where a.id=b.id

enter image description here

il retournera seulement toutes les données où 'A' et 'b' tables 'id' valeur est la même, signifie partie commune.

Extra: si vous voulez faire votre requête comme droit joindre dans un format ancien ou moderne, alors il apparaîtra comme ci-dessous:

enter image description here

:

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

moderne:

select  a.id, b.id, a.col_2, b.col_2, ...
from a
Right join b ON a.id=b.id

ou

select  a.id, b.id, a.col_2, b.col_2, ...
from a
Right join b using(id)

Réf & aide:

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

Jointure Externe Gauche à l'aide de signe + dans Oracle 11g

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

14
répondu Md. Salman Fahad Famous 2017-10-30 05:48:03

dans la pratique, le symbole + est placé directement dans l'énoncé conditionnel et sur le côté de la table optionnelle (celle qui peut contenir des valeurs vides ou nulles dans l'énoncé conditionnel).

5
répondu sunny 2017-08-02 17:21:45