Utilisation de jointures externes
Les jointures internes ne retournent des lignes que lorsqu'une ligne au moins des deux tables correspond à la condition de jointure. Les jointures internes éliminent les lignes qui ne correspondent pas à une ligne de l'autre table. Quant aux jointures externes, elles retournent toutes les lignes d'au moins une des tables ou vues mentionnées dans la clause FROM, pour autant que ces lignes répondent à une des conditions de recherche WHERE ou HAVING. Toutes les lignes sont extraites de la table de gauche référencée par une jointure externe gauche, et de la table de droite référencée par une jointure externe droite. Toutes les lignes des deux tables sont retournées dans une jointure externe complète.
SQL Server utilise les mots ISO suivants pour les jointures externes spécifiées dans une clause FROM :
LEFT OUTER JOIN ou LEFT JOIN
RIGHT OUTER JOIN ou RIGHT JOIN
FULL OUTER JOIN ou FULL JOIN
Utilisation de jointures externes gauches
Considérons une jointure des tables Product et ProductReview sur leurs colonnes ProductID respectives. Les résultats montrent uniquement les produits pour lesquels des commentaires ont été rédigés.
Pour inclure tous les produits, qu’ils aient ou non fait l'objet d'un commentaire, utilisez une jointure externe gauche ISO. Voici la requête :
USE AdventureWorks;
GO
SELECT p.Name, pr.ProductReviewID
FROM Production.Product p
LEFT OUTER JOIN Production.ProductReview pr
ON p.ProductID = pr.ProductID
LEFT OUTER JOIN inclut toutes les lignes de la table Product dans les résultats, qu'il y ait ou non une correspondance sur la colonne ProductID de la table ProductReview. Dans les résultats, si, à un produit donné, ne correspond aucun ID de commentaire de produit, la ligne contient une valeur NULL dans la colonne ProductReviewID.
Utilisation de jointures externes droites
Considérons une jointure des tables SalesTerritory et SalesPerson sur leurs colonnes TerritoryID respectives. Les résultats montrent le secteur affecté à un vendeur. L'opérateur ISO de jointure externe droite, RIGHT OUTER JOIN, indique que toutes les lignes de la deuxième table doivent figurer dans les résultats, qu'il y ait ou non des données correspondantes dans la première table.
Pour inclure dans les résultats tous les vendeurs, qu'ils soient ou non responsables d'un secteur, utilisez une jointure externe droite ISO. Voici la requête Transact-SQL et les résultats de la jointure externe droite :
USE AdventureWorks;
GO
SELECT st.Name AS Territory, sp.SalesPersonID
FROM Sales.SalesTerritory st
RIGHT OUTER JOIN Sales.SalesPerson sp
ON st.TerritoryID = sp.TerritoryID ;
Voici l'ensemble des résultats.
Territory SalesPersonID
-------------------------------------------------- -------------
NULL 268
Northeast 275
Southwest 276
Central 277
Canada 278
Southeast 279
Northwest 280
Southwest 281
Canada 282
Northwest 283
NULL 284
United Kingdom 285
France 286
Northwest 287
NULL 288
Germany 289
Australia 290
(17 row(s) affected)
Une jointure externe peut être davantage restreinte à l'aide d'un prédicat. L'exemple ci-dessous contient la même jointure externe droite, mais il ne s'applique qu'aux secteurs géographiques dont les ventes sont inférieures à 2 000 000 USD :
USE AdventureWorks;
GO
SELECT st.Name AS Territory, sp.SalesPersonID
FROM Sales.SalesTerritory st
RIGHT OUTER JOIN Sales.SalesPerson sp
ON st.TerritoryID = sp.TerritoryID
WHERE st.SalesYTD < $2000000;
Pour plus d'informations sur les prédicats, consultez WHERE (Transact-SQL).
Utilisation d'une jointure externe complète
Pour conserver les informations non correspondantes en incluant les lignes non correspondantes dans les résultats d'une jointure, utilisez une jointure externe complète. SQL Server fournit l'opérateur de jointure complète, FULL OUTER JOIN, qui inclut toutes les lignes des deux tables, que l'autre table ait une valeur correspondante ou non.
Considérons une jointure des tables Product et SalesOrderDetail sur leurs colonnes ProductID respectives. Les résultats montrent uniquement les produits qui font l'objet d'une commande. L'opérateur ISO FULL OUTER JOIN, indique que toutes les lignes des deux tables doivent figurer dans les résultats, qu'il y ait ou non des données correspondantes dans les tables.
Vous pouvez associer une clause WHERE à une jointure externe complète pour ne retourner que les lignes dans lesquelles les tables n'ont pas de données correspondantes. La requête ci-dessous retourne uniquement les produits dépourvus de commandes correspondantes, ainsi que les commandes qui ne correspondent à aucun produit (bien que, dans ce cas, toutes les commandes soient associées à un produit).
USE AdventureWorks;
GO
-- The OUTER keyword following the FULL keyword is optional.
SELECT p.Name, sod.SalesOrderID
FROM Production.Product p
FULL OUTER JOIN Sales.SalesOrderDetail sod
ON p.ProductID = sod.ProductID
WHERE p.ProductID IS NULL
OR sod.ProductID IS NULL
ORDER BY p.Name ;