84 votes

Jointure externe gauche utilisant le signe + dans Oracle 11g

Quelqu'un peut-il me dire si les deux requêtes ci-dessous sont un exemple de jointure externe gauche ou de jointure externe droite ?

Table Part:
Name         Null?       Type
PART_ID      NOT NULL    VARCHAR2(4)
SUPPLIER_ID              VARCHAR2(4)

PART_ID SUPPLIER_ID
P1      S1
P2      S2
P3  
P4  

Table Supplier:
Name            Null?     Type
SUPPLIER_ID NOT NULL      VARCHAR2(4)
SUPPLIER_NAME   NOT NULL  VARCHAR2(20)

SUPPLIER_ID  SUPPLIER_NAME
S1           Supplier#1
S2           Supplier#2
S3           Supplier#3

Affichez toutes les pièces, qu'elles soient fournies par un fournisseur ou non :

SELECT P.Part\_Id, S.Supplier\_Name
FROM Part P, Supplier S
WHERE P.Supplier\_Id = S.Supplier\_Id (+)

SELECT P.Part\_Id, S.Supplier\_Name
FROM Part P, Supplier S
WHERE S.Supplier\_Id (+) = P.Supplier\_Id

29 votes

Vous devez éviter d'utiliser la notation '(+)' et mettre à jour les requêtes pour utiliser des jointures explicites.

3 votes

@JonathanLeffler 100% d'accord. Le problème est que je travaille avec des personnes qui ne veulent pas passer à la notation standard. J'écris de nouvelles requêtes avec la notation standard, mais je serai prêt à tirer dans une minute si une ancienne requête est modifiée.

3 votes

@JonathanLeffler Je suis d'accord, sauf si vous utilisez Oracle. Oracle, tel qu'il est actuellement, ne gère pas la syntaxe ansi aussi bien que l'opérateur (+) en interne. Bien qu'ils recommandent d'utiliser la syntaxe ansi :) docs.oracle.com/cd/B28359_01/server.111/b28286/queries006.ht‌​m

-3voto

somedude Points 1

Il y a quelques informations incorrectes dans ce fil. J'ai copié et collé l'information incorrecte :

JOINTURE EXTERNE GAUCHE

SELECT *
FROM A, B
WHERE A.column = B.column(+)

JOINTURE EXTERNE DROITE

SELECT *
FROM A, B
WHERE B.column(+) = A.column

Ce qui précède est FAUX !!!!! C'est inversé. J'ai déterminé que c'était incorrect grâce au livre suivant :

Guide d'examen Oracle OCP Introduction à Oracle 9i : SQL . Le tableau 3-1 de la page 115 contient un bon résumé à ce sujet. Je ne pouvais pas comprendre pourquoi mon SQL converti ne fonctionnait pas correctement jusqu'à ce que je me mette à la vieille école et que je regarde dans un livre imprimé !

Voici le résumé de ce livre, copié ligne par ligne :

Oracle outer Join Syntax :

from tab_a a, tab_b b,                                       
where a.col_1 + = b.col_1                                     

Équivalent ANSI/ISO :

from tab_a a left outer join  
tab_b b on a.col_1 = b.col_1

Remarquez ici que c'est l'inverse de ce qui est affiché ci-dessus. Je suppose qu'il est possible que ce livre ait des errata, cependant je fais plus confiance à ce livre qu'à ce qui est dans ce fil. C'est un guide d'examen pour l'amour du ciel...

4 votes

Cela contredit ce que j'ai cité dans ma réponse, qui est un extrait de Oracle Database 10g SQL (Osborne ORACLE Press Series) 1ère édition (20 février 2004), qui stipule : "Dans une jointure externe gauche, l'opérateur de jointure externe est en fait à droite de l'opérateur d'égalité." Voici une démonstration de votre exemple . Les résultats de a.col_1(+) = b.col_1 correspond à RIGHT JOIN, pas à LEFT JOIN.

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