Utiliser des jointures externes

Effectué

Bien qu’elles ne sont pas aussi courantes que les jointures internes, l’utilisation de jointures externes dans une requête multi-table peut fournir une autre vue de vos données métier. Comme avec les jointures internes, vous exprimez une relation logique entre les tables. Toutefois, vous allez récupérer non seulement les lignes avec des attributs correspondants, mais également toutes les lignes présentes dans une ou les deux tables, qu’il y ait ou non une correspondance dans l’autre table.

Précédemment, vous avez appris à utiliser une jointure interne pour rechercher des lignes correspondantes entre deux tables. Comme vous l’avez vu, le processeur de requêtes génère les résultats d’une requête INNER JOIN en filtrant les lignes qui ne répondent pas aux conditions exprimées dans le prédicat de clause ON. Le résultat est que seules les lignes avec une ligne correspondante dans l’autre table sont retournées. Avec une jointure EXTERNE, vous pouvez choisir d’afficher toutes les lignes qui ont des lignes correspondantes entre les tables, ainsi que toutes les lignes qui n’ont pas de correspondance dans l’autre table. Examinons un exemple, puis examinons le processus.

Tout d’abord, examinez la requête suivante, écrite avec une jointure interne :

SELECT emp.FirstName, ord.Amount
FROM HR.Employee AS emp
INNER JOIN Sales.SalesOrder AS ord
    ON emp.EmployeeID = ord.EmployeeID;

Ces lignes représentent une correspondance entre HR. Employee and Sales.SalesOrder. Seules les valeurs EmployeeID qui se trouvent dans les deux tables apparaissent dans les résultats.

Diagramme de Venn montrant les membres correspondants des ensembles Employee et SalesOrder

À présent, examinons la requête suivante, écrite avec LEFT OUTER JOIN :

SELECT emp.FirstName, ord.Amount
FROM HR.Employee AS emp
LEFT OUTER JOIN Sales.SalesOrder AS ord
    ON emp.EmployeeID = ord.EmployeeID;

Cet exemple utilise un opérateur LEFT OUTER JOIN, qui dirige le processeur de requêtes pour conserver toutes les lignes de la table à gauche (HR). Employee) et affiche les valeurs Amount pour les lignes correspondantes dans Sales.SalesOrder. Toutefois, tous les employés sont retournés, qu’ils aient ou non pris une commande commerciale. À la place de la valeur Amount , la requête retourne NULL pour les employés sans commandes commerciales correspondantes.

Diagramme venn montrant les résultats de jointure externe des ensembles Employee et SalesOrder

Syntaxe d’une jointure externe

Les jointures externes sont exprimées à l’aide des mots clés LEFT, RIGHT ou FULL devant OUTER JOIN. L’objectif du mot clé est d’indiquer la table (à droite ou à gauche du mot clé JOIN) qui doit être conservée et dont toutes les lignes doivent être affichées, avec correspondance ou sans correspondance.

Lorsque vous utilisez LEFT, RIGHT ou FULL pour définir une jointure, vous pouvez omettre le mot clé OUTER comme indiqué ici :

SELECT emp.FirstName, ord.Amount
FROM HR.Employee AS emp
LEFT JOIN Sales.SalesOrder AS ord
    ON emp.EmployeeID = ord.EmployeeID;

Toutefois, comme le mot clé INNER, il est souvent utile d’écrire du code explicite sur le type de jointure utilisé.

Lorsque vous écrivez des requêtes à l’aide de OUTER JOIN, tenez compte des instructions suivantes :

  • Comme vous l'avez vu, on préfère les alias de table non seulement pour la liste SELECT, mais également pour la clause ON.
  • Comme avec une jointure INTERNE, une JOINTURE EXTERNE peut être effectuée sur une seule colonne correspondante ou sur plusieurs attributs correspondants.
  • Contrairement à une jointure intérieure, l’ordre dans lequel les tables sont répertoriées et jointes dans la clause FROM est important avec une jointure externe, car il détermine si vous choisissez une jointure gauche ou droite pour votre jointure.
  • Les jointures multitables sont plus complexes avec une jointure externe. La présence de NULLs dans les résultats d’une jointure externe peut entraîner des problèmes si les résultats intermédiaires sont ensuite joints à une troisième table. Les lignes avec des valeurs NULL peuvent être exclues par le prédicat de la deuxième jointure.
  • Pour afficher uniquement les lignes où aucune correspondance n’existe, ajoutez un test pour NULL dans une clause WHERE suivant un prédicat OUTER JOIN.
  • Une JOINTURE EXTERNE COMPLÈTE est utilisée rarement. Elle retourne toutes les lignes correspondantes entre les deux tables, plus toutes les lignes de la première table sans correspondance dans la seconde, ainsi que toutes les lignes de la deuxième table sans correspondance dans la première.
  • Il n’existe aucun moyen de prédire l’ordre dans lequel les lignes seront renvoyées sans clause ORDER BY. Il n’y a aucun moyen de savoir s’il s’agit des lignes correspondantes ou non correspondantes qui sont retournées en premier.