Utilisation de jointures internes
Une jointure interne est une jointure dans laquelle les valeurs des colonnes jointes sont comparées à l'aide d'un opérateur de comparaison.
Dans la norme ISO, les jointures internes peuvent être spécifiées au choix dans une clause FROM ou dans une clause WHERE. Il s'agit du seul type de jointure pris en charge par ISO dans la clause WHERE. Les jointures internes spécifiées dans la clause WHERE sont reconnues comme des jointures internes dépassées.
La requête Transact-SQL suivante est un exemple de jointure interne :
USE AdventureWorks;
GO
SELECT *
FROM HumanResources.Employee AS e
INNER JOIN Person.Contact AS c
ON e.ContactID = c.ContactID
ORDER BY c.LastName
Cette jointure interne est reconnue comme une équi-jointure. Elle retourne toutes les colonnes des deux tables et ne retourne que les lignes qui ont une valeur équivalente dans la colonne de la jointure.
Jointures utilisant des opérateurs autres que « égal » (=)
Vous pouvez également joindre des valeurs de deux colonnes qui ne sont pas égales. Vous pouvez utiliser les mêmes opérateurs et prédicats que ceux des jointures internes afin de créer des jointures inégales. Pour plus d'informations sur les opérateurs et les prédicats disponibles pouvant être utilisés dans les jointures, consultez Utilisation d'opérateurs dans les expressions et WHERE (Transact-SQL).
L'exemple suivant utilise une jointure « inférieur à » (<) pour trouver les prix de vente du produit 718 qui sont inférieurs au prix courant recommandé pour ce produit.
USE AdventureWorks;
GO
SELECT DISTINCT p.ProductID, p.Name, p.ListPrice, sd.UnitPrice AS 'Selling Price'
FROM Sales.SalesOrderDetail AS sd
JOIN Production.Product AS p
ON sd.ProductID = p.ProductID AND sd.UnitPrice < p.ListPrice
WHERE p.ProductID = 718;
GO
Voici l'ensemble des résultats.
ProductID Name ListPrice Selling Price
----------- --------------------------- ------------------ -------------
718 HL Road Frame - Red, 44 1431.5000 758.0759
718 HL Road Frame - Red, 44 1431.5000 780.8182
718 HL Road Frame - Red, 44 1431.5000 858.90
(3 row(s) affected)
Jointures utilisant l'opérateur « différent de » (<>)
La jointure « différent de » <> s'emploie rarement. En général, elle n'a de sens que dans le contexte d'une auto-jointure. Par exemple, les deux jointures Transact-SQL (réflexive et « différent de ») mentionnées ci-après permettent de trouver les sous-catégories contenant au moins deux prix différents inférieurs à $15 :
USE AdventureWorks;
GO
SELECT DISTINCT p1.ProductSubcategoryID, p1.ListPrice
FROM Production.Product p1
INNER JOIN Production.Product p2
ON p1.ProductSubcategoryID = p2.ProductSubcategoryID
AND p1.ListPrice <> p2.ListPrice
WHERE p1.ListPrice < $15 AND p2.ListPrice < $15
ORDER BY ProductSubcategoryID;
[!REMARQUE]
L'expression NOT column_name = column_name est équivalente à column_name <> column_name.
L'exemple Transact-SQL suivant combine une jointure « différent de » et une jointure réflexive pour extraire les lignes de la table ProductVendor dans laquelle deux lignes ou plus possèdent le même ProductID mais des numéros VendorID différents (en d'autres termes, les produits pour lesquels il existe plusieurs fournisseurs) :
USE AdventureWorks;
GO
SELECT DISTINCT p1.VendorID, p1.ProductID
FROM Purchasing.ProductVendor p1
INNER JOIN Purchasing.ProductVendor p2
ON p1.ProductID = p2.ProductID
WHERE p1.VendorID <> p2.VendorID
ORDER BY p1.VendorID