Oracle
 sql >> Base de données >  >> RDS >> Oracle

Jointures gauche et droite à l'aide de la connexion Plus (+) dans Oracle

  • Qu'est-ce qu'une jointure interne ?
  • Qu'est-ce qu'une jointure externe ?
    • Exécution de jointures externes à l'aide du symbole (+)

Comme pratiquement toutes les bases de données relationnelles, Oracle permet de générer des requêtes qui combinent ou JOIN lignes de deux tables ou plus pour créer le jeu de résultats final. Bien qu'il existe de nombreux types des jointures réalisables, les plus courantes sont les INNER JOIN et le OUTER JOIN .

Dans ce didacticiel, nous allons brièvement explorer la différence entre le INNER et OUTER JOIN puis examinez la méthode abrégée fournie par Oracle pour effectuer des OUTER JOINS en utilisant spécifiquement le + symbole de l'opérateur.

Qu'est-ce qu'une jointure interne ?

Une INNER JOIN dans une base de données relationnelle est simplement la jointure de deux ou plusieurs tables dans lesquelles le résultat ne contiendra que des données qui satisfont à toutes les conditions de jointure .

Par exemple, nous avons ici une library de base schéma avec deux tables :books et languages . Les languages table est juste une liste de noms de langues possibles et un id de langue unique :

SELECT * FROM library.languages;

id   name
1   English
2   French
3   German
4   Mandarin
5   Spanish
6   Arabic
7   Japanese
8   Russian
9   Greek
10   Italian

Pendant ce temps, nos books la table a un language_id ligne qui pour la plupart des livres, mais pas tous, contient simplement le language_id associé à la langue de publication originale du livre :

SELECT * FROM
  books
ORDER BY
  id
FETCH FIRST 10 ROWS ONLY;

id title    author    year_published    language_id
1   In Search of Lost Time  Marcel Proust   1913    2
2   Ulysses James Joyce 1922    1
3   Don Quixote Miguel de Cervantes 1605    5
4   Moby Dick   Herman Melville 1851    1
5   Hamlet  William Shakespeare 1601 (null)
6   War and Peace   Leo Tolstoy 1869    8
7   The Odyssey Homer   -700    9
8   The Great Gatsby    F. Scott Fitzgerald 1925    1
9   The Divine Comedy   Dante Alighieri     1472    10
10  Madame Bovary   Gustave Flaubert    1857    2

Dans de nombreux cas, nous pouvons souhaiter effectuer un INNER JOIN des books et languages tables donc plutôt que de voir le language_id dénué de sens valeur de chaque livre, nous pouvons en fait voir le language name à la place.

SELECT
  b.id,
  b.title,
  b.author,
  b.year_published,
  l.name language
FROM
  books b
INNER JOIN
  library.languages l
ON
  b.language_id = l.id
ORDER BY
  b.id
FETCH FIRST 10 ROWS ONLY;

id title    author    year_published    language
1   In Search of Lost Time  Marcel Proust   1913    French
2   Ulysses James Joyce 1922    English
3   Don Quixote Miguel de Cervantes 1605    Spanish
4   Moby Dick   Herman Melville 1851    English
6   War and Peace   Leo Tolstoy 1869    Russian
7   The Odyssey Homer   -700    Greek
8   The Great Gatsby    F. Scott Fitzgerald 1925    English
9   The Divine Comedy   Dante Alighieri     1472    Italian
10  Madame Bovary   Gustave Flaubert    1857    French
11  The Brothers Karamazov  Fyodor Dostoyevsky  1880    Russian

Ce qu'il est important de noter ici, c'est que notre ensemble de résultats était légèrement différent dans les deux requêtes ci-dessus. Dans le premier, nous avons simplement listé les premiers 10 livres, mais dans le INNER JOIN requête, nous renvoyons uniquement les résultats qui remplissent toutes les conditions des deux tables. Pour cette raison, la fiche de Hamlet (qui a un language_id valeur de null ou vide) est ignoré et non renvoyé dans le résultat de notre INNER JOIN .

Qu'est-ce qu'une jointure externe ?

Au lieu de renvoyer exclusivement des résultats qui satisfont à toutes les conditions de jointure d'un INNER JOIN , un OUTER JOIN renvoie non seulement les résultats qui satisfont toutes les conditions, mais aussi renvoie les lignes d'une table qui n'ont pas satisfait à la condition. La table choisie pour ce "contournement" des exigences conditionnelles est déterminée par la directionnalité ou "côté" de la jointure, généralement appelée LEFT ou RIGHT jointures externes.

Lors de la définition d'un côté de votre OUTER JOIN , vous spécifiez quelle table renverra toujours sa ligne même si l'élément opposé table de l'autre côté de la jointure a manquant ou null valeurs dans le cadre de la condition de jointure.

Par conséquent, si nous effectuons le même JOIN de base comme ci-dessus pour récupérer des books et language names , nous savons que nos books table doit toujours renvoyer des données, donc notre JOIN le côté doit "pointer vers" nos books table, rendant ainsi les languages tablez le OUTER tableau que nous y attachons.

Pour ce faire, nous changeons simplement :

books b INNER JOIN library.languages l

… à ceci :

books b LEFT OUTER JOIN library.languages l

Ainsi, l'ensemble de la requête et du résultat semble presque identique au INNER JOIN sauf cette modification mineure :

SELECT
  b.id,
  b.title,
  b.author,
  b.year_published,
  l.name language
FROM
  books b
LEFT OUTER JOIN
  library.languages l
ON
  b.language_id = l.id
ORDER BY
  b.id
FETCH FIRST 10 ROWS ONLY;

id title    author    year_published    language
1   In Search of Lost Time  Marcel Proust   1913    French
2   Ulysses James Joyce 1922    English
3   Don Quixote Miguel de Cervantes 1605    Spanish
4   Moby Dick   Herman Melville 1851    English
5   Hamlet  William Shakespeare 1601  (null)
6   War and Peace   Leo Tolstoy 1869    Russian
7   The Odyssey Homer   -700    Greek
8   The Great Gatsby    F. Scott Fitzgerald 1925    English
9   The Divine Comedy   Dante Alighieri     1472    Italian
10  Madame Bovary   Gustave Flaubert    1857    French

Comme prévu, en utilisant un LEFT OUTER JOIN au lieu du précédent INNER JOIN , nous obtenons le meilleur des deux mondes :nous ne sautons aucun books enregistrements (tels que Hamlet ) simplement parce que le language_id la valeur est null pour cet enregistrement, mais pour tous les enregistrements où language_id existe, nous obtenons le language name bien formaté obtenu à partir de nos languages tableau.

Exécution de jointures externes à l'aide du symbole (+)

Comme indiqué dans la documentation officielle, Oracle fournit un outer join operator spécial (le + symbole) qui est un raccourci pour effectuer OUTER JOINS .

En pratique, le + le symbole est placé directement au conditionnel et du côté de la table optionnelle (celle qui est autorisée à contenir vide ou null valeurs dans le conditionnel).

Par conséquent, nous pouvons à nouveau réécrire notre LEFT OUTER JOIN ci-dessus instruction utilisant le + opérateur comme ceci :

SELECT
  b.id,
  b.title,
  b.author,
  b.year_published,
  l.name language
FROM
  books b,
  library.languages l
WHERE
  l.id (+)= b.language_id
ORDER BY
  b.id
FETCH FIRST 10 ROWS ONLY;

Les résultats sont les mêmes que le standard LEFT OUTER JOIN exemple ci-dessus, nous ne les inclurons donc pas ici. Cependant, il y a un aspect critique à noter à propos de la syntaxe utilisant le + opérateur pour OUTER JOINS .

Le + l'opérateur doit être à gauche du conditionnel (à gauche des égaux = signe). Par conséquent, dans ce cas, parce que nous voulons nous assurer que nos languages table est la table facultative qui peut retourner null valeurs lors de cette comparaison, nous avons permuté l'ordre des tables dans ce conditionnel, donc languages est à gauche (et est facultatif) tandis que books est à droite.

Enfin, à cause de cette réorganisation des côtés du tableau au conditionnel lors de l'utilisation du + , il est important de réaliser que ce qui précède est simplement un raccourci pour un RIGHT OUTER JOIN . Cela signifie que cet extrait de requête :

FROM
  books b,
  library.languages l
WHERE
  l.id (+)= b.language_id

…est effectivement identique à ceci :

FROM
  library.languages l
RIGHT OUTER JOIN
  books b
ON
  b.language_id = l.id