web-dev-qa-db-fra.com

Rejoindre externe gauche en utilisant le signe + dans Oracle 11g

Quelqu'un peut-il me dire si, en dessous de 2 requêtes, il existe 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, que le fournisseur les fournisse ou non:

 SELECT P.Part_Id, S.Supplier_Name 
 FROM Partie P, Fournisseur S 
 WHERE P.Supplier_Id = S.Supplier_Id (+) 
 
 SELECT P.Part_Id, S.Supplier_Name 
 FROM Part P, Fournisseur S 
 WHERE S.Supplier_Id (+) = P.Supplier_Id 
78
Mike

TableA LEFT OUTER JOIN TableB est équivalent à TableB RIGHT OUTER JOIN Table A.

Dans Oracle, (+) désigne la table "facultative" dans la jointure. Donc, dans votre première requête, il s'agit d'un P LEFT OUTER JOIN S. Dans votre deuxième requête, il s'agit de S RIGHT OUTER JOIN P. Ils sont fonctionnellement équivalents.

Dans la terminologie, RIGHT ou LEFT spécifie quel côté de la jointure a toujours un enregistrement et l'autre côté peut être null. Ainsi, dans un P LEFT OUTER JOIN S, P aura toujours un enregistrement car il est sur le LEFT, mais S pourrait être nul.

Voir cet exemple de Java2s.com pour une explication supplémentaire.


Pour clarifier, je suppose que je dis que la terminologie importe peu, car elle n’est là que pour aider à visualiser. Ce qui compte, c’est que vous compreniez le concept de son fonctionnement.


DROITE vs GAUCHE

J'ai constaté une certaine confusion quant à l'importance de déterminer RIGHT vs LEFT dans la syntaxe de jointure implicite.

JOINTURE EXTERNE GAUCHE

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

DROITE EXTERIEUR JOIN

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

Je n'ai fait que permuter les termes de la clause WHERE, mais ils sont toujours équivalents sur le plan fonctionnel. (Voir plus haut dans ma réponse pour plus d'informations à ce sujet.) L'emplacement de (+) détermine DROITE ou GAUCHE. (Spécifiquement, si le (+) est à droite, c'est une jointure à gauche. Si (+) est à gauche, c'est une jointure à droite.)


Types de JOIN

Les deux styles de JOIN sont des JOIN implicites et des JOIN explicites . Ce sont des styles différents d’écriture de JOIN, mais ils sont fonctionnellement équivalents.

Voir this SO question .

JOINDUES implicites listent simplement toutes les tables ensemble. Les conditions de jointure sont spécifiées dans une clause WHERE.

JOIN implicite

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

Les JOINs explicites associent des conditions de jointure à l'inclusion d'une table spécifique plutôt qu'à une clause WHERE.

JOIN explicite

SELECT *
FROM A
LEFT OUTER JOIN B ON A.column = B.column

Ces jointures implicites peuvent être plus difficiles à lire et à comprendre, et ont également quelques limitations, car les conditions de jointure sont mélangées dans d'autres conditions WHERE. En tant que tels, les JOIN implicites sont généralement recommandés en faveur de la syntaxe explicite.

179
Wiseguy

Ces deux requêtes effectuent OUTER JOIN. Voir ci-dessous

Oracle vous recommande d'utiliser la syntaxe OUTER JOIN de la clause FROM plutôt que l'opérateur de jointure Oracle. Les requêtes de jointure externe qui utilisent l'opérateur de jointure Oracle (+) sont soumises aux règles et restrictions suivantes, qui ne s'appliquent pas à la syntaxe de la clause FROM, OUTER JOIN:

  • Vous ne pouvez pas spécifier l'opérateur (+) dans un bloc de requête contenant également la syntaxe de jointure de la clause FROM.

  • L'opérateur (+) ne peut apparaître que dans la clause WHERE ou, dans le contexte de la corrélation de gauche (lors de la spécification de la clause TABLE) dans la clause FROM, et ne peut être appliqué qu'à une colonne d'une table ou d'une vue.

  • Si A et B sont liés par plusieurs conditions de jointure, vous devez utiliser l'opérateur (+) dans toutes ces conditions. Si vous ne le faites pas, Oracle Database renverra uniquement les lignes résultant d'une jointure simple, mais sans avertissement ni erreur pour vous informer que vous ne disposez pas des résultats d'une jointure externe.

  • L'opérateur (+) ne génère pas de jointure externe si vous 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 joindre une table à elle-même, bien que les jointures auto soient valides. Par exemple, l'instruction suivante n'est pas valide:

    -- The following statement is not valid:
    SELECT employee_id, manager_id
       FROM employees
       WHERE employees.manager_id(+) = employees.employee_id;
    

    Toutefois, la jointure automatique suivante est valide:

    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, pas à une expression arbitraire. Cependant, une expression arbitraire peut contenir une ou plusieurs colonnes marquées avec l'opérateur (+).

  • Une condition WHERE contenant l'opérateur (+) ne peut pas être combinée à une autre condition à l'aide de l'opérateur logique OR.

  • Une condition WHERE ne peut pas utiliser la condition de comparaison IN pour comparer une colonne marquée avec l'opérateur (+) à une expression.

Si la clause WHERE contient une condition qui compare une colonne de la table B à une constante, l'opérateur (+) doit être appliqué à la colonne pour qu'Oracle retourne les lignes de la table A pour lesquelles elle a généré des valeurs NULL pour cette colonne. Sinon, Oracle ne renvoie que les résultats d'une jointure simple.

Dans une requête qui effectue des jointures externes de plus de deux paires de tables, une seule table peut être la table générée par null pour une seule autre table. Pour cette raison, vous ne pouvez pas appliquer l'opérateur (+) aux colonnes de B dans les conditions de jointure pour A et B et les conditions de jointure pour B et C. Reportez-vous à SELECT pour obtenir la syntaxe d'une jointure externe.

Extrait de http://download.Oracle.com/docs/cd/B28359_01/server.111/b28286/queries006.htm

8
Rahul

J'ai vu quelques contradictions dans les réponses ci-dessus, je viens d'essayer ce qui suit sur Oracle 12c et ce qui suit est correct:

JOINTURE EXTERNE GAUCHE

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

DROITE EXTERIEUR JOIN

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