Jointure externe gauche en utilisant le signe + dans Oracle 11g
est-ce que quelqu'un peut me dire si ci-dessous 2 requêtes sont un exemple de jointure externe gauche ou 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
afficher toutes les pièces, qu'un fournisseur les fournisse 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
Merci!
4 réponses
TableA LEFT OUTER JOIN TableB
est équivalent à TableB RIGHT OUTER JOIN Table A
.
dans Oracle, (+)
indique la table "optionnelle" dans la jointure. Donc, dans votre première requête, c'est un P LEFT OUTER JOIN S
. Dans votre deuxième requête, c'est S RIGHT OUTER JOIN P
. ils sont fonctionnellement équivalents.
dans la terminologie, droite ou gauche spécifier quel côté de la jointure a toujours un enregistrement, et l'autre côté pourrait être nul. Ainsi, dans un P LEFT OUTER JOIN S
, P
sera toujours avoir un enregistrement parce qu'il est sur le LEFT
, mais S
pourrait être nul.
Voir cet exemple de java2s.com pour plus d'explication.
pour clarifier, je suppose que je dis que la terminologie n'a pas d'importance, car il est seulement là pour aider à visualiser. Ce qui importe, c'est que vous compreniez le concept de comment cela fonctionne.
RIGHT vs Gauche
j'ai vu une certaine confusion sur ce qui importe dans la détermination droit vs gauche dans la syntaxe de jointure implicite.
JOINT EXTÉRIEUR GAUCHE
SELECT *
FROM A, B
WHERE A.column = B.column(+)
DROIT EXTÉRIEUR JOINTURE
SELECT *
FROM A, B
WHERE B.column(+) = A.column
Tout ce que j'ai fait c'est échanger les côtés des termes dans la clause où, mais ils sont toujours fonctionnellement équivalents. (Voir plus haut dans ma réponse pour plus d'informations à ce sujet.) L'emplacement du (+)
détermine à droite ou à gauche. (Plus précisément, si le (+)
est à droite, C'est une jointure à gauche. Si (+)
est à gauche, C'est une jonction à droite.)
Types D'assemblage
les deux styles de jointure sont jointures implicites et jointures explicites . Ils sont différents styles d'écriture jointures, mais ils sont fonctionnellement équivalents.
Voir cette SORTE de question .
joint implicite il suffit d'énumérer tous les tableaux ensemble. Les conditions d'adhésion sont spécifiées dans une clause "où".
jonction implicite
SELECT *
FROM A, B
WHERE A.column = B.column(+)
joint explicite associe les conditions d'adhésion avec l'inclusion d'une table spécifique au lieu d'une clause où.
Explicite REJOINDRE
SELECT *
FROM A
LEFT OUTER JOIN B ON A.column = B.column
ces Les jointures implicites peuvent être plus difficiles à lire et à comprendre, et elles ont aussi quelques limites puisque les conditions de jointure sont mélangées dans d'autres où les conditions. Ainsi, les jointures implicites sont généralement déconseillées en faveur d'une syntaxe explicite.
ces deux requêtes exécutent OUTER JOIN
. Voir ci-dessous
Oracle recommande d'utiliser la syntaxe de jointure externe de clause plutôt que L'opérateur Oracle join. Les requêtes externes de jointure qui utilisent Oracle opérateur de jointure (+) sont soumis aux règles suivantes et les restrictions, qui ne s'appliquent pas à la clause de hors jointure syntaxe:
vous ne pouvez pas spécifier l'opérateur (+) dans un requête bloc aussi contient la syntaxe de jointure de clause.
l'opérateur ( + ) ne peut apparaître que dans la clause où ou, dans le contexte de la corrélation de gauche (lors de la spécification de la clause de TABLE) dans le De la clause, et peut être appliqué seulement à une colonne d'un tableau ou d'une vue.
Si A et b sont rejoints par plusieurs conditions de jointure, alors vous devez utiliser l'opérateur ( + ) dans toutes ces conditions. Si vous n'avez pas, alors Oracle Database retournera seulement les lignes résultant d'un simple joindre, mais sans avertissement ou erreur pour vous aviser que vous ne les résultats d'une jointure externe.
l'opérateur (+) ne produit pas de jointure extérieure si vous en spécifiez une table dans la requête externe et l'autre table dans une requête interne.
vous ne pouvez pas utiliser l'opérateur ( + ) pour m', bien que l'auto jointures sont valides. Par exemple, l'instruction suivante n'est pas valable:
-- The following statement is not valid: SELECT employee_id, manager_id FROM employees WHERE employees.manager_id(+) = employees.employee_id;
cependant, l'auto-adhésion suivante est valable:
SELECT e1.employee_id, e1.manager_id, e2.employee_id FROM employees e1, employees e2 WHERE e1.manager_id(+) = e2.employee_id ORDER BY e1.employee_id, e1.manager_id, e2.employee_id;
l'opérateur (+) ne peut être appliqué qu'à une colonne, et non à un expression. Cependant, une expression arbitraire peut contenir un ou plus de colonnes marquées avec l'opérateur ( + ).
A Lorsque la condition contenant l'opérateur (+) ne peut pas être combinée avec une autre condition utilisant L'opérateur logique OR.
A où la condition ne peut pas utiliser la condition de comparaison pour comparer colonne marquée avec l'opérateur ( + ) avec une expression.
si la clause WHERE contient une condition qui compare une colonne de tableau B avec une constante, alors l'opérateur (+) doit être appliqué à le colonne de manière à ce que Oracle renvoie les lignes de la table A pour lesquelles il a généré des valeurs null pour cette colonne. Dans le cas contraire, Oracle ne renvoie que les les résultats d'une simple jointure.
Dans une requête qui effectue les jointures externes de plus de deux paires de tables, une seule table peut être null-table générée par une seule autre table. Pour cette raison, vous ne pouvez pas appliquer l'opérateur (+) aux colonnes de B dans la condition d'assemblage pour A et B et la condition d'assemblage Pour B et C. Reportez-vous à SELECT pour la syntaxe d'une jointure externe.
tiré de http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/queries006.htm
j'ai vu quelques contradictions dans les réponses ci-dessus, je viens d'essayer la suivante sur Oracle 12c et la suivante est correcte:
JOINT EXTÉRIEUR GAUCHE
SELECT *
FROM A, B
WHERE A.column = B.column(+)
ATTACHE EXTÉRIEURE DROITE
SELECT *
FROM A, B
WHERE B.column(+) = A.column
Il y a des informations incorrectes dans ce fil. J'ai copié et collé l'information incorrecte:
JOINT EXTÉRIEUR GAUCHE
SELECT * FROM A, B WHERE A.column = B.column(+)
ATTACHE EXTÉRIEURE DROITE
SELECT * FROM A, B WHERE B.column(+) = A.column
ci-dessus est FAUX!!!!! C'est inversé. Comment j'ai déterminé qu'il est incorrect est du livre suivant:
Oracle OCP Introduction to Oracle 9i: SQL Exam Guide . Le Tableau 3-1 présente un bon résumé à ce sujet. Je ne pouvais pas comprendre pourquoi mon SQL converti ne fonctionnait pas correctement jusqu'à ce que je suis allé vieille école et regardé dans un livre imprimé!
Voici le résumé de ce livre, copié ligne par ligne:
Oracle outer jointure syntaxe:
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
remarquons ici que c'est l'inverse de ce qui est posté surtout. Je suppose qu'il est possible pour ce livre d'avoir errata, mais je fais plus confiance à ce livre que ce qui est dans ce fil. C'est un guide d'examen pour pleurer à haute voix...