Utiliser des jointures internes
Le type de jointure le plus fréquent dans les requêtes T-SQL est la jointure interne. Les jointures internes sont utilisées pour résoudre de nombreux problèmes métier courants, en particulier dans les environnements de base de données hautement normalisés. Pour récupérer des données qui ont été stockées dans plusieurs tables, vous devez souvent les combiner via des requêtes de jointure interne. Une jointure interne commence sa phase de traitement logique comme un produit cartésien, qui est ensuite filtré pour supprimer toutes les lignes qui ne correspondent pas au prédicat.
Traitement d’une jointure interne
Examinons les étapes par lesquelles SQL Server traite logiquement une requête de jointure. Les numéros de ligne des exemples hypothétiques suivants sont ajoutés pour plus de clarté :
1) SELECT emp.FirstName, ord.Amount
2) FROM HR.Employee AS emp
3) JOIN Sales.SalesOrder AS ord
4) ON emp.EmployeeID = ord.EmployeeID;
Comme vous devez le savoir, la clause FROM est traitée avant la clause SELECT. Suivons le traitement, à partir de la ligne 2 :
- La clause FROM spécifie la table HR.Employee comme une des tables d’entrée, en lui donnant l’alias emp.
- L’opérateur JOIN de la ligne 3 reflète l’utilisation d’une jointure interne (type par défaut dans T-SQL) et spécifie Sales.SalesOrder comme l’autre table d’entrée, dont l’alias est ord.
- SQL Server effectue une jointure cartésienne logique sur ces tables et passe les résultats sous la forme d’une table virtuelle à l’étape suivante. (Le traitement physique de la requête peut ne pas effectuer l’opération de produit cartésien, en fonction des décisions de l’optimiseur. Mais il peut être utile d’imaginer la création du produit cartésien).
- À l’aide de la clause ON, SQL Server filtre la table virtuelle et ne garde que les lignes où une valeur EmployeeID de la table emp correspond à un EmployeeID de la table ord.
- Les lignes restantes sont laissées dans la table virtuelle et transmises à l’étape suivante dans l’instruction SELECT. Dans cet exemple, la table virtuelle est ensuite traitée par la clause SELECT et les deux colonnes spécifiées sont retournées à l’application cliente.
Le résultat de la requête terminée est une liste d’employés et leurs montants de commandes. Les employés qui n’ont pas de commandes associées ont été masqués par la clause ON, comme toutes les commandes qui ont un EmployeeID qui ne correspond pas à une entrée de la table HR.Employee.
Syntaxe d’une jointure interne
Une jointure interne est le type de jointure par défaut et le mot clé INNER facultatif est implicite dans la clause JOIN. Quand vous mélangez et mettez en correspondance des types de jointure, spécifiez explicitement le type de jointure, comme indiqué dans cet exemple hypothétique :
SELECT emp.FirstName, ord.Amount
FROM HR.Employee AS emp
INNER JOIN Sales.SalesOrder AS ord
ON emp.EmployeeID = ord.EmployeeID;
Quand vous écrivez des requêtes avec des jointures internes, tenez compte des indications suivantes :
- Les alias de table sont préférés, non seulement pour la liste SELECT, mais également pour l’écriture de la clause ON.
- Les jointures internes peuvent être effectuées sur une seule colonne correspondante, par exemple, OrderID, ou sur plusieurs attributs correspondants, par exemple, la combinaison d’OrderID et de ProductID. Les jointures qui spécifient plusieurs colonnes correspondantes sont appelées jointures composites.
- L’ordre dans lequel les tables sont listées dans la clause FROM pour une jointure interne n’a pas d’importance pour l’optimiseur SQL Server. Conceptuellement, les jointures sont évaluées de gauche à droite.
- Utilisez le mot clé JOIN une fois pour chaque paire de tables jointes dans la liste FROM. Pour une requête à deux tables, spécifiez une seule jointure. Pour une requête à trois tables, vous utilisez deux fois JOIN : une fois entre les deux premières tables, et une nouvelle fois entre la sortie de la jointure entre les deux premières tables et la troisième table.
Exemples de jointure interne
L’exemple hypothétique suivant effectue une jointure sur une seule colonne correspondante, en associant le ProductModelID de la table Production.Product au ProductModelID de la table Production.ProductModel :
SELECT p.ProductID, m.Name AS Model, p.Name AS Product
FROM Production.Product AS p
INNER JOIN Production.ProductModel AS m
ON p.ProductModelID = m.ProductModelID
ORDER BY p.ProductID;
L’exemple suivant montre comment une jointure interne peut être étendue pour inclure plus de deux tables. La table Sales.SalesOrderDetail est jointe à la sortie de la jointure entre Production.Product et Production.ProductModel. Chaque instance de JOIN/ON effectue son propre remplissage et filtrage de la table de sortie virtuelle. L’optimiseur de requête SQL Server détermine l’ordre dans lequel les jointures et le filtrage sont effectués.
SELECT od.SalesOrderID, m.Name AS Model, p.Name AS ProductName, od.OrderQty
FROM Production.Product AS p
INNER JOIN Production.ProductModel AS m
ON p.ProductModelID = m.ProductModelID
INNER JOIN Sales.SalesOrderDetail AS od
ON p.ProductID = od.ProductID
ORDER BY od.SalesOrderID;