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.
Microsoft SQL Server 2005 utilise les mots clés SQL-92 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, que l'un d'eux ait ou non fait l'objet de la rédaction d'un commentaire, utilisez une jointure externe gauche SQL-92. 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 de jointure externe droite SQL-92, 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 SQL-92. 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 de jointure externe complète SQL-92, 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 ;
Voir aussi
Concepts
Utilisation d'opérateurs dans les expressions
Autres ressources
Opérateurs (Transact-SQL)
SELECT (Transact-SQL)
Exemples SELECT (Transact-SQL)