Imbriquer une requête à l'intérieur d'une autre requête ou dans une expression à l'aide d'une sous-requête

Parfois, vous voulez utiliser les résultats d'une requête sous la forme d'un champ dans une autre requête, ou en tant que critère pour un champ de requête. Supposons, par exemple, que vous vouliez afficher l'intervalle entre des commandes pour chacun de vos produits. Pour créer une requête qui affiche cet intervalle, vous devez comparer chaque date de commande à d'autres dates de commande pour ce produit. la comparaison entre ces dates de commande nécessite également une requête. Vous pouvez imbriquer cette requête à l'intérieur de votre requête principale à l'aide d'une sous-requête (sous-requête : instruction SQL SELECT qui se situe à l’intérieur d’une autre requête Sélection ou Action.).

Vous pouvez écrire une sous-requête dans une expression (expression : toute combinaison d’opérateurs mathématiques ou logiques, de constantes, de fonctions, de noms de champs, de contrôles et de propriétés qui s’évalue pour donner une seule valeur. Les expressions peuvent réaliser des calculs, manipuler des caractères ou tester des données.) ou une instruction SQL (Structured Query Language) en mode SQL (mode SQL : onglet d’objet qui affiche l’instruction SQL correspondant à la requête en cours ou qui est utilisé pour créer une requête spécifique à SQL (Union, directe ou Définition de données). Lorsque vous créez une requête en mode Création, l’équivalent SQL est construit en mode SQL.).

Dans cet article


Utiliser les résultats d'une requête comme un champ dans une autre requête

Vous pouvez utiliser une sous-requête en tant qu'alias (alias (SQL) : autre nom d’une table ou d’un champ dans des expressions. Les alias sont souvent utilisés pour raccourcir le nom de la table ou du champ pour les références qui y seront faites dans le code, pour éviter d’éventuelles références ambiguës ou pour fournir un nom plus évocateur dans des résultats de requête.) de champ. Utilisez une sous-requête en tant qu'alias de champ lorsque vous voulez utiliser les résultats d'une sous-requête sous la forme d'un champ dans votre requête principale.

 Remarque   Une sous-requête que vous utilisez en tant qu'alias de champ ne peut pas renvoyer plus d'un champ.

Vous pouvez utiliser un alias de champ de sous-requête pour afficher des valeurs qui dépendent d'autres valeurs dans la ligne en cours, ce qui n'est pas possible sans recourir à une sous-requête. Revenons à l'exemple dans lequel vous souhaitez afficher l'intervalle entre des commandes pour chacun de vos produits. Pour déterminer cet intervalle, vous devez comparer chaque date de commande à d'autres dates de commande pour ce produit. Vous pouvez créer une requête qui affiche ces informations à l'aide du modèle Northwind 2007.

AfficherProcédure pour configurer Northwind 2007

  1. Cliquez sur le bouton Microsoft Office Image du bouton, puis cliquez sur Nouveau.
  1. Dans le volet de gauche, sous Catégories de modèles, cliquez sur Mes modèles.
  2. Sous Mes modèles, cliquez sur Northwind 2007, puis sur Créer.
  3. Suivez les instructions fournies dans la page Les Comptoirs (sous l'onglet de l'objet Écran Démarrage) pour ouvrir la base de données, puis fermez la fenêtre Boîte de dialogue de connexion.

  1. Sous l'onglet Créer, dans le groupe Autre, cliquez sur Création de requête.
  1. Dans la boîte de dialogue Afficher la table, cliquez sur l'onglet Requêtes, puis double-cliquez sur Commandes produit.
  2. Fermez la boîte de dialogue Afficher la table.
  3. Double-cliquez sur le champ ID de produit et sur le champ Date de commande pour les ajouter à la grille de création de requête.
  4. Dans la ligne Trier de la colonne ID de produit de la grille, sélectionnez Croissant.
  5. Dans la ligne Trier de la colonne Date de commande de la grille, sélectionnez Décroissant.
  6. Dans la troisième colonne de la grille, cliquez avec le bouton droit sur la ligne Champ, puis cliquez sur Zoom dans le menu contextuel.
  7. Dans la boîte de dialogue Zoom, tapez ou collez l'expression suivante :
Prior Date: (SELECT MAX([Order Date]) 
FROM [Product Orders] AS [Old Orders] 
WHERE [Old Orders].[Order Date] 
 < [Product Orders].[Order Date] 
AND [Old Orders].[Product ID] 
 = [Product Orders].[Product ID])

Cette expression est la sous-requête. Pour chaque ligne, la sous-requête sélectionne la date de commande la plus récente qui est moins récente que la date de commande déjà associée à la ligne. Notez l'utilisation du mot clé AS pour créer un alias de table, afin que vous puissiez comparer des valeurs dans la sous-requête aux valeurs de la ligne actuelle de la requête principale.

  1. Dans la quatrième colonne de la grille, à la ligne Champ, tapez l'expression suivante :
Interval: [Order Date]-[Prior Date]

Cette expression calcule l'intervalle entre chaque date de commande et la date de commande précédente de ce produit, à l'aide de la valeur de date antérieure que nous avons définie en utilisant une sous-requête.

  1. Sous l'onglet Créer, dans le groupe Résultats, cliquez sur Exécuter.

La requête s'exécute et affiche une liste de noms de produit, de dates de commande, de dates de commande précédentes et l'intervalle entre les dates de commande. Les résultats sont triés d'abord par ID de produit (dans l'ordre croissant), puis par date de commande (en ordre décroissant).

 Remarque   Puisque l'ID de produit est un champ de recherche, par défaut, Access affiche les valeurs recherchées (dans ce cas, le nom du produit), plutôt que les ID de produit réels. Bien que cela modifie les valeurs qui s'affichent, l'ordre de tri n'est pas modifié.

  1. Fermez la base de données Northwind.

Haut de la page Haut de la page

Utiliser une sous-requête en tant que critère pour un champ de requête

Vous pouvez utiliser une sous-requête en tant que critère (critères : conditions que vous spécifiez pour limiter les enregistrements à inclure dans le jeu de résultats d’une requête ou d’un filtre.) de champ. Utilisez une sous-requête en tant que critère de champ lorsque vous souhaitez utiliser les résultats de la sous-requête pour limiter les valeurs que le champ affiche.

Supposons, par exemple, que vous souhaitiez consulter une liste des commandes qui ont été traitées par les employés qui ne sont pas des agents commerciaux. Pour générer cette liste, vous devez comparer l'ID d'employé pour chaque commande à une liste d'ID d'employés qui ne sont pas des agents commerciaux. Pour créer cette liste et l'utiliser en tant que critère de champ, vous devez utiliser une sous-requête, comme indiqué dans la procédure suivante :

  1. Ouvrez Northwind 2007.accdb et activez son contenu.
  2. Fermez le formulaire d'ouverture de session.
  3. Sous l'onglet Créer, dans le groupe Autre, cliquez sur Création de requête.
  1. Dans la boîte de dialogue Afficher la table, sous l'onglet Tables, double-cliquez sur Commandes, puis sur Employés.
  2. Fermez la boîte de dialogue Afficher la table.
  3. Dans la table Commandes, double-cliquez sur les champs Réf employé, N° commande et Date de la commande pour les ajouter à la grille de création de requête. Dans la table Employés, double-cliquez sur le champ Fonction pour l'ajouter à la grille de création.
  4. Cliquez avec le bouton droit sur la ligne Critères de la colonne Réf employé, puis cliquez sur Zoom dans le menu contextuel.
  5. Dans la zone Zoom, tapez ou collez l'expression suivante :
IN (SELECT [ID] FROM [Employees] 
WHERE [Job Title]<>'Sales Representative')

Il s'agit de la sous-requête. Elle sélectionne toutes les références dans lesquelles la fonction de l'employé n'est pas Agent commercial. En outre, elle fournit ce jeu de résultats à la requête principale. La requête principale vérifie ensuite si les références d'employé de la table Commandes figurent dans le jeu de résultats.

  1. Sous l'onglet Créer, dans le groupe Résultats, cliquez sur Exécuter.

La requête s'exécute et les résultats de la requête affichent une liste de commandes qui ont été traitées par les employés qui ne sont pas des agents commerciaux.

Haut de la page Haut de la page

Mots clés SQL courants que vous pouvez utiliser avec une sous-requête

Il existe plusieurs mots clés SQL que vous pouvez utiliser avec une sous-requête

 Remarque   Cette liste n'est pas exhaustive. Vous pouvez utiliser n'importe quel mot clé SQL valide dans une sous-requête, à l'exclusion des mots clés de définition de données.

  • ALL    Utilisez ALL dans une clause WHERE pour récupérer des lignes qui satisfont la condition lors de la comparaison avec chaque ligne renvoyée par la sous-requête.

Supposons, par exemple, que vous analysiez des données d'élèves dans un lycée. Les élèves doivent conserver une moyenne générale (GPA) minimale qui varie d'un major à un autre. Les élèves majors et leur moyenne générale minimale sont stockés dans une table nommée Majors, tandis que les informations pertinentes sur les élèves sont stockées dans un tableau appelé Student_Records.

Pour afficher une liste de majors (et de leurs moyennes générales minimales) dans laquelle chaque étudiant avec cette moyenne Major dépasse la moyenne générale minimale, vous pouvez utiliser la requête suivante :

SELECT [Major], [Min_GPA] 
FROM [Majors]
WHERE [Min_GPA] < ALL
(SELECT [GPA] FROM [Student_Records]
 WHERE [Student_Records].[Major]=[Majors].[Major]);
  • ANY    Utilisez ANY dans une clause WHERE pour récupérer des lignes qui satisfont la condition lors de la comparaison avec au moins l'une des lignes renvoyées par la sous-requête.

Supposons, par exemple, que vous analysiez des données d'élèves dans un lycée. Les élèves doivent conserver une moyenne générale minimale qui varie entre Major et Major. Les élèves Majors et leur moyenne générale minimale sont stockés dans une table nommée Majors, tandis que les informations pertinentes sur les élèves sont stockées dans un tableau appelé Student_Records.

Pour afficher une liste de majors (et de leurs moyennes générales minimales) dans laquelle tout étudiant avec cette moyenne Major ne correspond pas à la moyenne générale minimale, vous pouvez utiliser la requête suivante :

SELECT [Major], [Min_GPA] 
FROM [Majors]
WHERE [Min_GPA] > ANY
(SELECT [GPA] FROM [Student_Records]
 WHERE [Student_Records].[Major]=[Majors].[Major]);

 Remarque   Vous pouvez également utiliser le mot clé SOME dans le même but ; le mot clé SOME est synonyme d'ANY.

  • EXISTS    Utilisez EXISTS dans une clause WHERE pour indiquer qu'une sous-requête devrait renvoyer au moins une ligne. Vous pouvez aussi faire précéder EXISTS par NOT, afin d'indiquer qu'une sous-requête ne doit pas renvoyer de lignes.

Par exemple, la requête suivante renvoie une liste de produits qui se trouvent dans au moins une commande existante :

SELECT *
FROM [Products]
WHERE EXISTS
(SELECT * FROM [Order Details]
 WHERE [Order Details].[Product ID]=[Products].[ID]);

En utilisant NOT EXISTS, la requête renvoie une liste de produits qui ne se trouvent pas dans au moins une commande existante :

SELECT *
FROM [Products]
WHERE NOT EXISTS
(SELECT * FROM [Order Details]
 WHERE [Order Details].[Product ID]=[Products].[ID]);
  • IN    Utilisez IN dans une clause WHERE pour vérifier qu'une valeur dans la ligne en cours de la requête principale fait partie du jeu renvoyé par la sous-requête. Vous pouvez également faire précéder IN par NOT, pour vérifier qu'une valeur dans la ligne en cours de la requête principale ne fait pas partie du jeu renvoyé par la sous-requête.

Par exemple, la requête suivante renvoie une liste de commandes (avec des dates de commande) qui ont été traitées par des employés qui ne sont pas des agents commerciaux :

SELECT [Order ID], [Order Date]
FROM [Orders]
WHERE [Employee ID] IN
(SELECT [ID] FROM [Employees]
 WHERE [Job Title]<>'Sales Representative');

En utilisant NOT IN, vous pourriez écrire la même requête comme suit :

SELECT [Order ID], [Order Date]
FROM [Orders]
WHERE [Employee ID] NOT IN
(SELECT [ID] FROM [Employees]
 WHERE [Job Title]='Sales Representative');

Haut de la page Haut de la page

 
 
S'applique à :
Access 2007