Share via


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 ;