Effectuer des jointures à l’aide d’Access SQL

Dans un système de bases de données relationnelles comme Access, vous êtes souvent amené à extraire des informations de plusieurs tables à la fois. Pour ce faire, vous pouvez utiliser une instruction SQL JOIN , qui vous permet de récupérer des enregistrements à partir de tables qui ont des relations définies, qu’elles soient un-à-un, un-à-plusieurs ou plusieurs-à-plusieurs.

JOINTURES INTERNES

La jointure INTERNE, également appelée jointure equi, est le type de jointure le plus couramment utilisé. Cette jointure permet d'extraire des lignes dans au moins deux tables en reliant des champs contenant une valeur commune à ces tables. Les types de données des champs utilisés pour la jointure doivent être similaires, par exemple, vous ne pouvez pas créer une jointure avec des champs dont le type de données est respectivement MÉMO et OBJETOLE.

Pour créer une instruction INNER JOIN, utilisez les mots clés INNER JOIN dans la clause FROM d'une instruction SELECT.

Cet exemple utilise une JOINTURE INTERNE pour rechercher tous les clients qui ont des factures en précisant la date et le montant de ces factures.

SELECT [Last Name], InvoiceDate, Amount 
   FROM tblCustomers INNER JOIN tblInvoices 
   ON tblCustomers.CustomerID=tblInvoices.CustomerID 
   ORDER BY InvoiceDate 

Notez que les noms des tables sont séparés par les mots clés INNER JOIN et que la comparaison relationnelle est indiquée après le mot clé ON. Pour les comparaisons relationnelles, vous pouvez également utiliser les <opérateurs , >, <= , >=, ou <> , et vous pouvez également utiliser l’mot clé BETWEEN. Notez également que les champs d'ID des deux tables ne sont utilisés que dans la comparaison relationnelle ; ils ne sont pas indiqués dans le jeu de résultats finaux.

Pour qualifier davantage l’instruction SELECT , vous pouvez utiliser une clause WHERE après la comparaison de jointure dans la clause ON .

L'exemple suivant restreint les résultats pour n'inclure que les factures postérieures au 1er janvier 1998.

SELECT [Last Name], InvoiceDate, Amount 
   FROM tblCustomers INNER JOIN tblInvoices 
   ON tblCustomers.CustomerID=tblInvoices.CustomerID 
   WHERE tblInvoices.InvoiceDate > #01/01/1998# 
   ORDER BY InvoiceDate 

Pour joindre plusieurs tables, vous pouvez imbriquer des clauses INNER JOIN. L’exemple suivant a recours à une instruction SELECT précédente pour créer le jeu de résultats, mais inclut également la ville et la région de chaque client en ajoutant une clause INNER JOIN pour la table tblShipping.

SELECT [Last Name], InvoiceDate, Amount, City, State 
   FROM (tblCustomers INNER JOIN tblInvoices 
   ON tblCustomers.CustomerID=tblInvoices.CustomerID) 
      INNER JOIN tblShipping 
      ON tblCustomers.CustomerID=tblShipping.CustomerID 
   ORDER BY InvoiceDate 

Notez que la première clause JOIN est entre parenthèses pour être séparée logiquement de la seconde clause JOIN. Il est également possible de joindre une table à elle-même à l’aide d’un alias pour le nom de la deuxième table dans la clause FROM . Supposons que vous voulez rechercher tous les enregistrements de clients qui ont le même nom de famille. Pour cela, créez l’alias « A » pour la seconde table et indiquez des prénoms différents pour la recherche.

SELECT tblCustomers.[Last Name], 
   tblCustomers.[First Name] 
   FROM tblCustomers INNER JOIN tblCustomers AS A 
   ON tblCustomers.[Last Name]=A.[Last Name] 
   WHERE tblCustomers.[First Name]<>A.[First Name] 
   ORDER BY tblCustomers.[Last Name] 

JOINTURES EXTERNES

Une jointure EXTERNE est utilisée pour récupérer des enregistrements de plusieurs tables tout en conservant les enregistrements de l’une des tables, même s’il n’y a pas d’enregistrement correspondant dans l’autre table. There are two types of OUTER JOINs that the Access database engine supports: LEFT OUTER JOINs and RIGHT OUTER JOINs.

Think of two tables that are beside each other, a table on the left and a table on the right. Left OUTER JOIN sélectionne toutes les lignes de la table de droite qui correspondent aux critères de comparaison relationnelle, ainsi que toutes les lignes de la table de gauche, même s’il n’existe aucune correspondance dans la table de droite. The RIGHT OUTER JOIN is simply the reverse of the LEFT OUTER JOIN; all rows in the right table are preserved instead.

À titre d'exemple, supposons que vous voulez déterminer le montant total facturé pour chaque client, mais si aucune facture n'existe pour un client, vous voulez que cela soit signalé en affichant le mot « NONE ».

SELECT [Last Name] & ', ' &  [First Name] AS Name, 
   IIF(Sum(Amount) IS NULL,'NONE',Sum(Amount)) AS Total 
   FROM tblCustomers LEFT OUTER JOIN tblInvoices 
   ON tblCustomers.CustomerID=tblInvoices.CustomerID 
   GROUP BY [Last Name] & ', ' &  [First Name] 

Plusieurs choses sont à noter dans l'instruction SQL précédente. La première étant l’utilisation de l’opérateur de concaténation de chaîne « & ». Cet opérateur vous permet de joindre au moins deux champs dans une seule chaîne. La seconde étant l’utilisation de l’instruction « immediate if » (IIf) qui vérifie si le total est nul. Si c’est le cas, l’instruction renvoie le mot « NONE ». Si le total n’est pas null, la valeur est retournée. Enfin, la clause OUTER JOIN est utilisée. L’utilisation de LEFT OUTER JOIN conserve les lignes de la table de gauche afin que vous voyiez tous les clients, même ceux qui n’ont pas de factures.

Des JOINTURES EXTERNES peuvent être imbriquées dans des JOINTURES INTERNES dans une jointure de plusieurs tables, en revanche, il n'est pas possible d'imbriquer des JOINTURES INTERNES dans des JOINTURES EXTERNES.

Le produit cartésien

Le produit cartésien est un terme qui revient souvent concernant les jointures. Un produit cartésien est défini comme « toutes les combinaisons possibles de toutes les lignes dans toutes les tables ». Par exemple, si vous deviez joindre deux tables sans aucun type de qualification ou de type de jointure, vous obtenez un produit cartésien.

SELECT * 
   FROM tblCustomers, tblInvoices 

Cela n'est pas un bon résultat, surtout avec des tables qui contiennent des centaines ou des milliers de lignes. Prenez soin de toujours qualifier vos jointures pour éviter d'obtenir des produits cartésiens.

L'opérateur UNION

Bien que l’opérateur UNION , également appelé requête union, ne soit pas techniquement une jointure, il est inclus ici, car il implique la combinaison de données de plusieurs sources de données dans un jeu de résultats, ce qui est similaire à certains types de jointures. L'opérateur UNION permet d'assembler des données de différentes tables, des instructions SELECT et des requêtes, en excluant les lignes en double. Les deux sources de données doivent avoir le même nombre de champs, mais les champs ne doivent pas être du même type de données. Supposons que vous disposez d’une table Employees qui a la même structure que la table Customers et que vous souhaitez créer une liste de noms et d’adresses de messagerie en combinant les deux tables.

SELECT [Last Name], [First Name], Email 
   FROM tblCustomers 
UNION 
SELECT [Last Name], [First Name], Email 
   FROM tblEmployees 

Pour récupérer tous les champs des deux tables, vous pouvez utiliser l’mot clé TABLE, comme suit.

TABLE tblCustomers 
UNION 
TABLE tblEmployees 

L’opérateur UNION n’affiche pas d’enregistrements qui sont des doublons exacts dans les deux tables, mais cela peut être remplacé à l’aide du prédicat ALL après l’mot clé UNION, comme suit :

SELECT [Last Name], [First Name], Email 
   FROM tblCustomers 
UNION ALL 
SELECT [Last Name], [First Name], Email 
   FROM tblEmployees 

L'instruction TRANSFORM

Bien que l’instruction TRANSFORM , également appelée requête analyse croisée, ne soit pas non plus considérée techniquement comme une jointure, elle est incluse ici, car elle implique la combinaison de données de plusieurs sources de données dans un jeu de résultats, ce qui est similaire à certains types de jointures.

Une instruction TRANSFORM sert à calculer une somme, une moyenne, un compte ou tout autre type de total produit par l’agrégation des enregistrements. Elle affiche les informations sous forme de grille ou de feuille de calcul dans laquelle les données sont présentées verticalement (lignes) et horizontalement (colonnes). Une instruction TRANSFORM se présente généralement comme ceci :

   TRANSFORM aggregating function 
   SELECT statement 
   PIVOT column heading field 

Supposons que vous voulez créer une feuille de données qui indique les totaux des factures pour chaque client par année. Les en-têtes verticaux indiquent les noms des clients et les en-têtes horizontaux les années. Vous pouvez modifier une instruction SQL précédente pour l'adapter à l'instruction TRANSFORM.

TRANSFORM 
IIF(Sum([Amount]) IS NULL,'NONE',Sum([Amount])) 
   AS Total 
SELECT [Last Name] & ', ' & [First Name] AS Name 
      FROM tblCustomers LEFT JOIN tblInvoices 
      ON tblCustomers.CustomerID=tblInvoices.CustomerID 
      GROUP BY [Last Name] & ', ' & [First Name] 
PIVOT Format(InvoiceDate, 'yyyy') 
   IN ('1996','1997','1998','1999','2000') 

N’oubliez pas que la fonction d’agrégation est la fonction Sum, que les en-têtes verticaux se trouvent dans la clause GROUP BY de l’instruction SELECT et que les titres horizontaux sont déterminés par le champ répertorié après l’mot clé PIVOT.

Assistance et commentaires

Avez-vous des questions ou des commentaires sur Office VBA ou sur cette documentation ? Consultez la rubrique concernant l’assistance pour Office VBA et l’envoi de commentaires afin d’obtenir des instructions pour recevoir une assistance et envoyer vos commentaires.