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!

75
demandé sur Kerrek SB 2011-07-02 23:50:08

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.

174
répondu Wiseguy 2017-05-23 12:26:23

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

8
répondu Rahul 2017-06-08 06:25:10

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
1
répondu Charles 2016-10-12 06:37:16

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...

-1
répondu somedude 2014-09-30 21:25:26