Principes de base des jointures

Les jointures permettent d'extraire des données de deux ou de plusieurs tables en fonction des relations logiques existant entre ces tables. Les jointures indiquent comment Microsoft SQL Server doit utiliser les données d'une table pour sélectionner les lignes d'une autre table.

Une condition de jointure définit la manière dont deux tables sont liées dans une requête :

  • en spécifiant la colonne de chaque table à utiliser pour la jointure. Une condition de jointure standard spécifie une clé étrangère d'une table et la clé qui lui est associée dans l'autre table ;

  • en spécifiant un opérateur logique (par exemple = ou <>) à utiliser pour comparer les valeurs des colonnes.

Vous pouvez spécifier des jointures internes dans les clauses FROM ou WHERE. Vous ne pouvez spécifier des jointures externes que dans la clause FROM. Les conditions de jointure peuvent être combinées aux conditions de recherche WHERE et HAVING afin de contrôler les lignes qui sont sélectionnées parmi les tables de base référencées dans la clause FROM.

Nous vous recommandons de spécifier les conditions de jointure dans la clause FROM car cela vous permet de les séparer des autres conditions de recherche susceptibles d'être spécifiées dans une clause WHERE. Voici une syntaxe de jointure simplifiée d'une clause FROM ISO :

FROM first_table join_type second_table [ON (join_condition)]

join_type spécifie le type de jointure : interne, externe ou croisée. join_condition définit le prédicat à évaluer pour chaque paire de lignes jointes. L'exemple suivant spécifie une jointure dans une clause FROM :

FROM Purchasing.ProductVendor JOIN Purchasing.Vendor
     ON (ProductVendor.BusinessEntityID = Vendor.BusinessEntityID)

L'instruction SELECT suivante utilise cette jointure :

SELECT ProductID, Purchasing.Vendor.BusinessEntityID, Name
FROM Purchasing.ProductVendor JOIN Purchasing.Vendor
    ON (Purchasing.ProductVendor.BusinessEntityID = Purchasing.Vendor.BusinessEntityID)
WHERE StandardPrice > $10
  AND Name LIKE N'F%'
GO

La sélection retourne les informations relatives au produit et au fournisseur pour toutes les combinaisons de pièces fournies par une société dont le nom commence par F et dont le prix du produit est supérieur à 10 $.

Lorsque plusieurs tables sont référencées dans une seule requête, aucune référence de colonne ne doit être ambiguë. Dans l'exemple précédent, les tables ProductVendor et Vendor contiennent toutes deux une colonne nommée BusinessEntityID. Tout nom de colonne dupliqué dans deux ou plusieurs tables référencées dans la requête doit être qualifié par le nom de la table. Toutes les références aux colonnes Vendor de l'exemple sont qualifiées.

Lorsqu'un nom de colonne n'est pas dupliqué dans d'autres tables utilisées dans la requête, les références à ce nom ne doivent pas être qualifiées par le nom de la table. Cette caractéristique apparaît dans l'exemple précédent. Une telle instruction SELECT est parfois difficile à comprendre car rien n'indique de quelle table provient chaque colonne. Vous pouvez donc améliorer la lisibilité de la requête si vous qualifiez toutes les colonnes par leur nom de table. La lisibilité est encore améliorée si vous utilisez des alias de table, surtout lorsque les noms de table eux-mêmes doivent être qualifiés par les noms de base de données et de propriétaire. Il s'agit du même exemple, à ceci près que des alias de table ont été affectés et que les colonnes ont été qualifiées par les alias de table afin d'améliorer la lisibilité :

SELECT pv.ProductID, v.BusinessEntityID, v.Name
FROM Purchasing.ProductVendor AS pv 
JOIN Purchasing.Vendor AS v
    ON (pv.BusinessEntityID = v.BusinessEntityID)
WHERE StandardPrice > $10
    AND Name LIKE N'F%';

Dans les exemples précédents, les conditions de jointure sont spécifiées dans la clause FROM, ce qui correspond à la méthode recommandée. La requête suivante contient la même condition de jointure spécifiée dans la clause WHERE :

SELECT pv.ProductID, v.BusinessEntityID, v.Name
FROM Purchasing.ProductVendor AS pv, Purchasing.Vendor AS v
WHERE pv.VendorID = v.VendorID
    AND StandardPrice > $10
    AND Name LIKE N'F%';

La liste de sélection d'une jointure peut faire référence à toutes les colonnes des tables jointes ou à un sous-ensemble de colonnes. Il n'est pas nécessaire que la liste de sélection contienne des colonnes de toutes les tables de la jointure. Dans une jointure sur trois tables, par exemple, vous pouvez n'utiliser qu'une seule table pour rapprocher l'une des autres tables de la troisième, sans qu'il soit nécessaire de référencer dans la liste de sélection une des colonnes de la table du milieu.

Bien que les conditions de jointure disposent généralement d'opérateurs de comparaison d'égalité (=), vous pouvez spécifier d'autres opérateurs de comparaison ou relationnels ainsi que d'autres prédicats. Pour plus d'informations, consultez Utilisation d'opérateurs dans les expressions et WHERE (Transact-SQL).

Lorsque SQL Server procède au traitement des jointures, le moteur de requête choisit (parmi plusieurs possibilités) la méthode de traitement la plus efficace. L'exécution physique de différentes jointures peut utiliser de nombreuses optimisations différentes et ne peut par conséquent pas être prédite de manière fiable.

Les colonnes utilisées dans une condition de jointure ne doivent pas forcément porter le même nom ou être du même type de données. Si les types de données ne sont pas identiques, ils doivent cependant être compatibles ou pouvoir être convertis de manière implicite par SQL Server. Si les types de données ne peuvent pas être convertis implicitement, la condition de jointure doit le faire explicitement à l'aide de la fonction CAST. Pour plus d'informations sur les conversions implicites et explicites, consultez Conversion de types de données (moteur de base de données).

La plupart des requêtes utilisant une jointure peuvent être réécrites à l'aide d'une sous-requête (une requête imbriquée dans une autre), et la plupart des sous-requêtes peuvent être réécrites sous forme de jointures. Pour plus d'informations sur les sous-requêtes, consultez Principes de base des sous-requêtes.

Notes

Les tables ne peuvent pas être jointes directement sur des colonnes ntext, text ou image. Elles peuvent cependant l'être indirectement sur des colonnes ntext, text ou image à l'aide de SUBSTRING. Par exemple, SELECT * FROM t1 JOIN t2 ON SUBSTRING(t1.textcolumn, 1, 20) = SUBSTRING(t2.textcolumn, 1, 20) exécute une jointure interne sur deux tables en prenant en compte les 20 premiers caractères de chaque colonne de type text dans les tables t1 et t2. En outre, il existe une autre possibilité de comparaison des colonnes ntext ou text de deux tables ; elle consiste à comparer les longueurs des colonnes à l'aide d'une clause WHERE. Par exemple : WHERE DATALENGTH(p1.pr_info) = DATALENGTH(p2.pr_info)