Utiliser des jointures externes
Bien qu’elles ne soient pas aussi courantes que les jointures internes, les jointures externes utilisées dans une requête multitable peuvent fournir une vue alternative de vos données métier. Comme avec les jointures internes, vous exprimez une relation logique entre les tables. Toutefois, vous récupérez non seulement les lignes avec des attributs correspondants, mais aussi 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 de jointure interne en excluant les lignes qui ne répondent pas aux conditions exprimées dans le prédicat de la clause ON. Le résultat retourne seulement les lignes qui ont une ligne correspondante dans l’autre table. 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. Prenons un exemple pour examiner 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 et Sales.SalesOrder. Seules les valeurs EmployeeID qui se trouvent dans les deux tables s’affichent dans les résultats.
À 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 indique au processeur de requêtes de conserver toutes les lignes de la table à gauche (HR.Employee) et affiche les valeurs Amount des lignes correspondantes dans Sales.SalesOrder. Toutefois, tous les employés sont retournés, qu’ils aient ou non pris une commande. À la place de la valeur Amount, la requête retourne NULL pour les employés qui n’ont pas de commande correspondante.
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.
Quand 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 avec le mot clé INNER, il est souvent utile d’écrire du code explicite sur le type de jointure utilisé.
Quand vous écrivez des requêtes avec des jointures externes, tenez compte des indications suivantes :
- Comme vous l’avez vu, les alias de table sont préférés, 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 INNER JOIN, l’ordre dans lequel les tables sont listées et jointes dans la clause FROM est important avec OUTER JOIN, car il détermine si vous choisissez LEFT ou RIGHT pour votre jointure.
- Les jointures multitables sont plus complexes avec une jointure externe. La présence de valeurs NULL 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 sans correspondance, ajoutez un test de valeurs NULL dans une clause WHERE à la suite d’un prédicat de jointure externe.
- Une jointure externe entière est rarement utilisée. 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’y a aucun moyen de prédire l’ordre de retour des lignes sans utiliser de 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.