Dernière mise à jour :2008-09-20

informatique

Création d'un recordset en joignant des champs provenant de plusieurs tables

La plupart des bases de données d'aujourd'hui sont construites suivant les principes fondamentaux du design de bases de données relationnelles. Les données de ces bases de données sont sont positionnées dans plusieurs tables qui sont reliées entre elles par des champs clés. Cet article montre comment utiliser SQL pour retourner des Recordsets contenant des données en provenance de multiples tables.

Imaginons une base de données gérant les données d'un libraire:

La base contiendrait deux tables:

Description de tables
Table Editeurs: Table Titres:
IdEditeur IdEditeur
Editeur IdTitre
Titre  

Tous les éditeurs se voit assigner un identifiant unique logé dans le champ IdEditeur de la table Editeurs. Dans la table Titres, l'éditeur est indiquer par l'identifiant de l'éditeur dans le champ nommé IdEditeur (comme dans la table Editeurs). Admettons que vous désirez créer un objet Recordset contenant les titres et les noms d'éditeurs. Ceci est possible en utilisant l'instruction INNER JOIN dans la clause FROM d'une commande SQL. Voiçi la requête qui donne un tel résultat.

SELECT Titres.Titre, Editeurs.Editeur
FROM Editeurs INNER JOIN Titres ON Editeurs.IdEditeur = Titres.IdEditeur

Dans une instruction SELECT normale, la clause FROM est très simple. Elle ne comprend que le nom de la table d'où proviendront les données sélectionnées. Une une requête rassemblant plusieurs tables, consiste en une ou plusieurs sous-clause, chacune basée sur l'instruction INNER JOIN.

Note: Dans l'exemple ci-dessus, les noms de champs sont précédés du nom de la table auquel ils appartiennent séparés par le caractère '.'. Cette syntaxe doit obligatoirement être emprunté lorsqu'un nom de champ se retrouve dans plusieurs table pour spécifier dans quelle table les données doivent être prises ou évaluées. Dans l'exemple, il n'aurait donc pas été nécessaire de spécifier Titres.Titre puisque le champ Titre ne se retrouve que dans la table Titres. Par contre, dans la seconde ligne, il est nécessaire d'indiquer de quel champ IdEditeur il est question puisque celui-ci se trouve dans deux tables différentes.

Ajoutons maintenant les deux nouvelles tables suivantes à notre base de données fictive:

Description de tables
Table Auteurs: Table AppartenanceAuteursEditeurs:
IdAuteur IdEditeur
Auteur IdAuteur

Puisque un éditeur peut avoir plusieurs auteurs et un auteur peut avoir plusieurs éditeurs, on se sert d'une table intermédiaire (AppartenanceAuteursEditeurs) pour éviter la répétition d'informations tel le nom d'auteur ou d'éditeur. Imaginez par exemple que cette table n'existe pas et que l'auteur numéro 2 tavaille pour les éditeurs 1 à 5. La table Auteur ressemblerait à ceci:

Auteur numéro 2 1
Auteur numéro 2 3
Auteur numéro 2 5
Auteur numéro 2 7
Auteur numéro 2 11

Si le champ Auteur se réserve l'espace de 100 caractères par nom d'auteur, imaginez le nombre d'espace mémoire utilisé inutilement. De plus, dans l'exemple la table Auteurs ne contient que le nom de l'auteur. Ce serait encore pire si elle contiendrait d'autres champs comme par exemple, l'adresse de l'auteur, sa ville, son age etc... Tous ces valeurs seraient dupliqués 5 fois.

Par contre, la table AppartenanceAuteursEditeurs ne contient que les numéros. Ceux sont deux champs numérique. Il ne nécessiteront pas beaucoup d'espace mémoire.

Vous vous demandez peut-être maintenant comment faire pour joindre le nom de l'auteur avec le nom de ses éditeurs ou le nom d'un éditeur avec les noms de ses auteurs.

Le programme VB suivant fait la création d'un objet Recordset qui contient ces enregistrements.

Listing 1.0 Atelier clause INNER JOIN
1. Dim objCon As ADODB.Connection
2. Dim objRs As ADODB.Recordset
3. 
4. Dim strCheminDB As String
5. Dim strSQL As String
6. 
7. ' Ouvrir une connection à la Base de données
8. strCheminDB = "c:\mabase.mdb"
9. objCon.ConnectionString = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & strCheminDB
10. Set objCon = New ADODB.Connection
11. objCon.Open strCon
12. 
13. ' Ouvrir le Recordset
14. Set objRs = New ADODB.Recordset
15. strSQL = "SELECT [Editeur], [Auteur] FROM Editeurs INNER JOIN ([AppartenanceAuteursEditeurs] INNER JOIN [Auteurs] ON [AppartenanceAuteursEditeurs].[IdAuteur]=[Auteurs].[IdAuteur]) ON [AppartenanceAuteursEditeurs].[IdEditeur]=[Editeurs].[IdEditeur];"
16. objRs.ActiveConnection = objCon
17. objRs.Source = strSQL
18. objRs.Open
19. 
20. 'Action quelconque
21. 
22. objRs.Close
23. objCon.Close
24. 
25. 'Destruction des objets ADO
26. 
27. Set objRs = Nothing
28. Set objCon = Nothing

Auteur : Sylvain Bilodeau

Date de mise en ligne : 2001-08-30

Aucun commentaire pour l'instant.