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

Remarque :  Nous faisons de notre mieux pour vous fournir le contenu d’aide le plus récent aussi rapidement que possible dans votre langue. Cette page a été traduite automatiquement et peut donc contenir des erreurs grammaticales ou des imprécisions. Notre objectif est de faire en sorte que ce contenu vous soit utile. Pouvez-vous nous indiquer en bas de page si ces informations vous ont aidé ? Voici l’article en anglais à des fins de référence aisée.

Parfois, vous pouvez juger utile d’utiliser les résultats d’une requête en tant que champ dans une autre requête ou en tant que critère pour un champ de requête. Par exemple, supposons que vous souhaitez afficher l’intervalle entre les commandes pour chacun de vos produits. Pour créer une requête qui affiche cet intervalle, vous devez comparer chaque date de commande aux autres dates de commande d’un produit particulier. La comparaison de ces dates de commande nécessite également une requête. Vous pouvez imbriquer cette requête dans votre requête principale en utilisant une sous-requête.

Vous pouvez écrire une sous-requête dans une expression ou dans une instruction SQL (Structured Query Language) en mode SQL.

Contenu de cet article

Utiliser les résultats d’une requête en tant que champ dans une autre requête

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

Mots clés SQL communs utilisables avec une sous-requête

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’un alias de champ. Utiliser une sous-requête en tant qu’un alias de champ lorsque vous voulez utiliser les résultats de la sous-requête en tant que 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.

Me montrer comment configurer Northwind 2007

  1. Cliquez sur le bouton Microsoft Office Image du bouton Office , puis cliquez sur Nouveau.

  2. Dans le volet de gauche, sous Catégories de modèles, cliquez sur Mes modèles.

  3. Sous Mes modèles, cliquez sur Northwind 2007, puis sur Créer.

  4. 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. Dans l'onglet Créer, cliquez sur Création de requête dans le groupe Autre.

  2. Dans la boîte de dialogue Afficher la table, cliquez sur l'onglet Requêtes, puis double-cliquez sur Commandes produit.

  3. Fermez la boîte de dialogue Afficher la table.

  4. 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.

  5. Dans la ligne Trier de la colonne ID de produit de la grille, sélectionnez Croissant.

  6. Dans la ligne Trier de la colonne Date de commande de la grille, sélectionnez Décroissant.

  7. 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.

  8. 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.

  9. 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é.

  2. Fermez la base de données Northwind.

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 champ critère. Utiliser une sous-requête en tant que champ critère lorsque vous voulez utiliser les résultats de la sous-requête pour limiter les valeurs qui affiche le champ.

Par exemple, supposez que vous voulez examiner la liste des commandes qui ont été traitées par des employés autres que des commerciaux. Pour générer cette liste, vous devez comparer la référence employé sur chaque commande à la liste des références d’employés non commerciaux. Pour créer cette liste et l’utiliser comme critère de champ, vous devez utiliser une sous-requête, comme le montre 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.

  4. Dans la boîte de dialogue Afficher la table, sous l'onglet Tables, double-cliquez sur Commandes, puis sur Employés.

  5. Fermez la boîte de dialogue Afficher la table.

  6. 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.

  7. Cliquez avec le bouton droit sur la ligne Critères de la colonne Réf employé, puis cliquez sur Zoom dans le menu contextuel.

  8. 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.

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

    Après exécution de la requête, la liste des commandes qui ont été traitées par des employés non commerciaux s’affichent en résultat.

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 les lignes qui respectent la condition lorsqu’elles sont comparées à chaque ligne renvoyée par le 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 les lignes qui respectent la condition lorsqu’elles sont comparées à au moins 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 doit renvoyer au moins une ligne. Vous pouvez également faire précéder EXISTS de NOT pour indiquer qu’une requête ne doit renvoyer aucune ligne.

    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 que la ligne active de la requête principale contient une valeur qui figure dans le jeu renvoyé par la sous-requête. Vous pouvez également faire précéder IN de NOT pour vérifier que la ligne active de la requête principale contient une valeur qui ne fait partie du jeu renvoyé par la 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

Développez vos compétences dans Office
Découvrez des formations
Accédez aux nouvelles fonctionnalités en avant-première
Rejoignez le programme Office Insider

Ces informations vous ont-elles été utiles ?

Nous vous remercions pour vos commentaires.

Merci pour vos commentaires. Il serait vraisemblablement utile pour vous de contacter l’un de nos agents du support Office.

×