Partager via


INNER JOIN, opération (Microsoft Access SQL)

S’applique à : Access 2013, Office 2013

Combine les enregistrements de deux tables chaque fois qu’un champ commun contient des valeurs correspondantes.

Syntaxe

FROM table1 INNER JOIN table2 ON table1. field1compopr table2. champ2

L'opération INNER JOIN est composée des arguments suivants :

Partie

Description

table1, table2

Nom des tables dont les enregistrements sont combinés.

champ1, champ2

Noms des champs joints. S'ils ne sont pas numériques, les champs doivent être du même type et contenir le même type de données, mais il ne doivent pas obligatoirement avoir le même nom.

oprcomp

Tout opérateur de comparaison relationnel : « = », « < », « > », « <= », « >= », ou « <> ».

Remarques

Vous pouvez utiliser une opération INNER JOIN dans n'importe quelle clause FROM. Il s'agit du type de jointure le plus courant. Les jointures internes combinent les enregistrements de deux tables lorsque des valeurs correspondent dans un champ commun aux deux tables.

Vous pouvez utiliser INNER JOIN avec les tables Departments et Employees pour sélectionner tous les employés dans chaque service. En revanche, pour sélectionner tous les services (même si aucun employé n'est affecté à certains services) ou tous les employés (même si certains d'entre eux ne sont pas affectés à un service), vous pouvez utiliser une opération LEFT JOIN ou RIGHT JOIN afin de créer une jointure externe.

Si vous essayez de joindre des champs contenant des données de type Mémo ou Objet OLE, une erreur se produit.

Vous pouvez joindre deux champs numériques de types identiques. Par exemple, vous pouvez joindre un champ AutoNumber à un champ Long, car ils sont de même type. En revanche, vous ne pouvez pas joindre des champs de type Single et Double.

L'exemple suivant montre comment vous pouvez joindre les tables Categories et Products sur le champ CategoryID :

SELECT CategoryName, ProductName 
FROM Categories INNER JOIN Products 
ON Categories.CategoryID = Products.CategoryID;

Dans l'exemple précédent, CategoryID est le champ joint, mais il n'est pas inclus dans le résultat de la requête, car il n'est pas inclus dans l'instruction SELECT. Pour inclure le champ joint, incluez le nom du champ dans l’instruction SELECT : dans ce cas, Categories.CategoryID.

Vous pouvez également lier plusieurs clauses ON dans une instruction JOIN, en utilisant la syntaxe suivante :

SELECT champs FROM table1 INNER JOIN table2 ON table1. field1compoprtable2. champ1 AND table1. field2compoprtable2. champ2 OR table1. field3compoprtable2. champ3 ;

Vous pouvez également imbriquer des instructions JOIN en utilisant la syntaxe suivante :

SELECT fields FROM table1 INNER JOIN (table2 INNER JOIN [( ]table3 [INNER JOIN [( ]tablex [INNER JOIN ...)] ON table3. field3compoprtablex. fieldx)] ON table2. field2compoprtable3. champ3) ON table1. field1compoprtable2. champ2 ;

Une jointure gauche (LEFT JOIN) ou droite (RIGHT JOIN) peut être imbriquée dans une jointure interne, mais une jointure interne ne peut pas être imbriquée dans une jointure gauche ou droite.

Exemple

Dans cet exemple, deux jointures équivalentes sont créées : une entre les tables Order Details et Orders et une autre entre les tables Orders et Employees. Ceci est nécessaire, car la table Employees ne contient pas de données de ventes et la table Order Details ne contient pas de données relatives aux employés. La requête produit une liste des employés avec le montant total de leurs ventes.

La procédure EnumFields (que vous pouvez trouver dans l'exemple d'instruction SELECT) est appelée dans cet exemple.

    Sub InnerJoinX() 
     
        Dim dbs As Database, rst As Recordset 
     
        ' Modify this line to include the path to Northwind 
        ' on your computer. 
        Set dbs = OpenDatabase("Northwind.mdb") 
         
        ' Create a join between the Order Details and  
        ' Orders tables and another between the Orders and  
        ' Employees tables. Get a list of employees and  
        ' their total sales. 
        Set rst = dbs.OpenRecordset("SELECT DISTINCTROW " _ 
            & "Sum(UnitPrice * Quantity) AS Sales, " _ 
            & "(FirstName & Chr(32) & LastName) AS Name " _ 
            & "FROM Employees INNER JOIN(Orders " _ 
            & "INNER JOIN [Order Details] " _ 
            & "ON [Order Details].OrderID = " _ 
            & "Orders.OrderID ) " _ 
            & "ON Orders.EmployeeID = " _ 
            & "Employees.EmployeeID " _ 
            & "GROUP BY (FirstName & Chr(32) & LastName);") 
         
        ' Populate the Recordset. 
        rst.MoveLast 
         
        ' Call EnumFields to print the contents of the  
        ' Recordset. Pass the Recordset object and desired 
        ' field width. 
        EnumFields rst, 20 
     
        dbs.Close 
     
    End Sub