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!
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
clauseOUTER 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 syntaxeFROM
clauseOUTER JOIN
:
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!
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 )
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
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:
:
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
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).