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 AdventureWorks2008R2;
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 commerciaux, 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 AdventureWorks2008R2;
GO
SELECT st.Name AS Territory, sp.BusinessEntityID
FROM Sales.SalesTerritory st 
RIGHT OUTER JOIN Sales.SalesPerson sp
ON st.TerritoryID = sp.TerritoryID ;

Voici l'ensemble des résultats.

Territory BusinessEntityID

-------------------------------------------------- -------------

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 AdventureWorks2008R2;
GO
SELECT st.Name AS Territory, sp.BusinessEntityID
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 AdventureWorks2008R2;
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 ;