Ecrire une requête de jointure Left Join avec SQL Server

Comment écrire une requête de jointure Left Join avec SQL Server ?

Avec les jointures gauche SQL, il est possible d’extraire des données de deux ou plusieurs tables SQL en se basant sur les relations entre les objets. Les jointures LEFT JOIN SQL Server indiquent comment le moteur SQL doit utiliser les données d’une table pour sélectionner les lignes d’une autre table.

Une jointure peut regrouper les données de plusieurs tables, et chaque relation entre deux tables est indiquée dans la requête. Les conditions de la requête indiquent comment relier logiquement les données entre les tables.

Ainsi, les conditions de jointure peuvent être spécifiées dans la clause FROM ou la clause WHERE. Avec la clause FROM par exemple, c’est la relation qui filtre les données affichées.

Exemples de jointures LEFT JOIN SQL Server

Tout d’abord, l’objectif de l’utilisation des jointures est d’éviter de stocker les mêmes données plusieurs fois dans une base de données. C’est ce que l’on appelle la normalisation d’une base de données relationnelle.

Par exemple, 2 millions de lignes de vente par an mais seulement 10 magasins physiques différents et 20 000 clients dans la base de données. Il est préférable de stocker toutes les informations dans les tables magasins et clients une seule fois et dans une table dédiée. Cela permet de réduire la taille de la base de données. Et donc d’améliorer les performances.

Spécificités d’une requête de jointure SQL

Elle est généralement filtrée à l’aide d’une clé primaire dans la première table, ou table principale. Et une clé étrangère dans les autres tables. Cela permet d’assurer la cohérence des données dans la base. Ce sont les clés logiques qui sont utilisées, et il n’est pas obligatoire que des contraintes physiques soient présentes dans le modèle de données.

Les différents types de jointures T-SQL

Quels sont les différents types de jointures T-SQL disponibles avec SQL Server ? Les différents types de jointures en T-SQL sont les suivants :

  • Jointure gauche – LEFT JOIN
  • Jointure externe gauche – LEFT OUTER JOIN
  • Jointure droite – RIGHT JOIN
  • Jointure externe droite – RIGHT OUTER JOIN
  • Jointure complète – FULL JOIN
  • Jointure extérieure complète – FULL OUTER JOIN
  • Jointure interne – INNER JOIN

Nous nous concentrerons ici sur les jointures gauches appelées LEFT JOIN.

Pour commencer à illustrer les différents types de jointures avec des exemples de requêtes, nous avons besoin d’un échantillon de données.

Utilisons la base de données Adventure Works, comme j’utilise la version MS SQL 2019, j’ai téléchargé la base de données AdventureWorks2019.

Toutes les étapes sont expliquées sur le site avec les liens vers toutes les versions d’AdventureWorks, de SQL Server 2008 R2 à SQL Server 2019. Considérons donc les tables Salesperson (vendeurs) et la table Store (magasins).

-- La table des vendeurs
SELECT TOP 15
   [BusinessEntityID], 
   [TerritoryID], 
   [SalesQuota], 
   [Bonus], 
   [CommissionPct], 
   [SalesYTD], 
   [SalesLastYear], 
   [rowguid], 
   [ModifiedDate]
FROM [Sales].[SalesPerson];

-- La table des magasins
SELECT TOP 15
   [BusinessEntityID], 
   [Name], 
   [SalesPersonID], 
   [rowguid], 
   [ModifiedDate]
FROM [Sales].[Store] 
ORDER BY [SalesPersonID];

Analyse des clefs étrangères entre les tables

Les tables Salesperson et Store sont liées entre elles par une contrainte physique. Noter que la colonne SalesPersonID de la colonne [Sales].[Store] est liée à la colonne BusinessEntityID de la table [Sales].[SalesPerson].

Cette différence dans les noms des colonnes est une source de confusion. Voici un extrait de la façon dont les deux tables sont liées. Le code provient de l’instruction de création de la table [Sales].[Store] qui contient les données des magasins :

ADD CONSTRAINT [FK_Store_SalesPerson_SalesPersonID]
  FOREIGN KEY([SalesPersonID]) 
    REFERENCES [Sales].[SalesPerson] ([BusinessEntityID]);

Les tables salesperson et sales territory sont également liées. Script extrait du code [Sales].[SalesPerson] qui contient les informations des vendeurs:

ADD  CONSTRAINT [FK_SalesPerson_SalesTerritory_TerritoryID]
  FOREIGN KEY([TerritoryID])
    REFERENCES [Sales].[SalesTerritory] ([TerritoryID]);

Une autre requête SQL complexe et très pratique permet elle de pivoter les lignes d’une table SQL Server en colonnes.

Exemple de requête gauche avec MS SQL

Par exemple, pour afficher le nom du magasin et les informations sur les ventes du vendeur, joindre la table SalesPerson et la table Store. Il est recommandé de créer un alias pour les tables afin de rendre la requête lisible.

La jointure LEFT JOIN utilise la première table de la clause FROM. La table des vendeurs (SalesPerson) est donc la première table.

Elle joint ensuite les données de la table de gauche (vendeurs) aux données de la table de droite (magasins).

SELECT 
   person.[BusinessEntityID],
   store.[Name] as StoreName, 
   [TerritoryID], 
   [SalesQuota], 
   [Bonus], 
   [CommissionPct], 
   [SalesYTD], 
   [SalesLastYear], 
   person.[rowguid], 
   person.[ModifiedDate]
FROM [Sales].[SalesPerson] person
   LEFT JOIN [Sales].[Store] store 
      on person.BusinessEntityID = store.[SalesPersonID]
ORDER BY person.[BusinessEntityID];

Exemple de requête MS SQL LEFT OUTER JOIN

Les requêtes LEFT JOIN et LEFT OUTER JOIN sont identiques, car elles renvoient exactement le même jeu de données. Pour supprimer les données disponibles uniquement dans la table de droite, utiliser la clause WHERE et exclure les valeurs NULL, comme dans l’exemple ci-dessous.

SELECT 
   person.[BusinessEntityID],
   store.[Name] as StoreName, 
   [TerritoryID], 
   [SalesQuota], 
   [Bonus], 
   [CommissionPct], 
   [SalesYTD], 
   [SalesLastYear], 
   person.[rowguid], 
   person.[ModifiedDate]
FROM [Sales].[SalesPerson] person
   LEFT JOIN [Sales].[Store] store 
      on person.BusinessEntityID = store.[SalesPersonID]
WHERE store.[SalesPersonID] IS NOT NULL
ORDER BY person.[BusinessEntityID];

Il semble donc qu’il n’y a pas de différence entre LEFT JOIN et LEFT OUTER JOIN dans les jointures SQL Server.

Gérer les performances des jointures avec SQL Server

Enfin, pour contrôler et maintenir une bonne performance avec des temps de réponse acceptables pour les requêtes de jointure, limiter les données dans l’instruction FROM.

Par exemple, limitez le nombre de lignes à analyser le plus tôt possible dans le processus. Par exemple en ajoutant un filtre dans la table de gauche et alléger ainsi la charge du plan d’exécution de la requête. Cet article expose quelques exemples de requêtes sur la façon de construire des jointures LEFT JOIN avec SQL Serveur.

Les requêtes SQL Server les plus courantes restent les requêtes de sélection et d’insertion des données.