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.