Je vérifie quelques anciennes instructions 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 lisait comme ceci:
select ...
from a,b
where a.id=b.id(+)
Je suis confus au sujet de l' (+)
opérateur, et je n'ai pu l'obtenir sur aucun forum ... (la recherche de + entre guillemets ne fonctionnait pas non plus).
Quoi qu'il en soit, j'ai utilisé 'Explain Plan' de SQLDeveloper et j'ai obtenu une sortie disant cela 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 doit-elle satisfaire certaines conditions (comme avoir des index, etc.) avant de (+)
pouvoir être utilisée? Il serait très utile que vous puissiez me fournir une compréhension simple, ou quelques bons liens où je peux lire à ce sujet.
Merci!
la source
Réponses:
Il s'agit d'une notation spécifique à Oracle pour une jointure externe, car le format ANSI-89 (utilisant une virgule dans la clause FROM pour séparer les références de table) ne standardisait pas les jointures externes.
La requête serait réécrite dans la syntaxe ANSI-92 comme suit:
Ce lien est assez bon pour expliquer la différence entre les JOIN .
Il convient également de noter que même si cela
(+)
fonctionne, Oracle recommande de ne pas l' utiliser :la source
L'opérateur (+) indique une jointure externe. Cela signifie qu'Oracle retournera toujours les enregistrements de l'autre côté de la jointure même en l'absence de correspondance. Par exemple, si a et b sont emp et dept et que vous pouvez avoir des employés non affectés à un service, l'instruction suivante renverra les détails de tous les employés, qu'ils aient ou non été affectés à un service.
Donc, en bref, la suppression du (+) peut faire une différence significative, mais vous pourriez ne pas le remarquer pendant un certain temps en fonction de vos données!
la source
Dans Oracle, (+) désigne la table "facultative" dans la jointure. Donc dans votre requête,
c'est une JOINTURE EXTERNE GAUCHE de la table 'b' à la table 'a'. Il renverra toutes les données de la table 'a' sans perdre ses données lorsque l'autre côté (table optionnelle 'b') n'a pas de données.
La syntaxe standard moderne pour la même requête serait
ou avec un raccourci pour
a.id=b.id
(non pris en charge par toutes les bases de données):Si vous supprimez (+), ce sera une requête de jointure interne normale
Syntaxe plus ancienne, à la fois dans Oracle et dans d'autres bases de données:
Syntaxe plus moderne:
Ou simplement:
Il ne retournera que toutes les données où la valeur 'id' des tables 'a' et 'b' est la même, signifie partie commune.
Si vous souhaitez faire de votre requête une jointure droite
C'est exactement la même chose qu'un LEFT JOIN, mais change quelle table est facultative.
Ancienne syntaxe Oracle:
Syntaxe standard moderne:
Réf et aide:
https://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:6585774577187
Jointure externe gauche à l'aide de la connexion + à Oracle 11g
https://www.w3schools.com/sql/sql_join_left.asp
la source
En pratique, le symbole + est placé directement dans l'instruction conditionnelle et sur le côté de la table optionnelle (celle qui est autorisée à contenir des valeurs vides ou nulles dans le conditionnel).
la source