Imbriquer une requête dans une autre requête ou dans une expression à l’aide d’une sous-requête

Important :  Cet article a été traduit automatiquement, voir l’avertissement. Vous pouvez consulter la version en anglais de cet article ici.

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 en tant que champ dans une autre requête

Vous pouvez utiliser une sous-requête en tant qu’alias de champ. Cela s’avère utile lorsque vous souhaitez 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 plusieurs champs.

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.

Procédure pour configurer Northwind 2007

  1. Cliquez sur le Bouton Microsoft Office Image du bouton Office , puis 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 de produits.

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

  4. Double-cliquez sur le champ Réf 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 Réf 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 correspond à la sous-requête. Pour chaque ligne, la sous-requête sélectionne la date de commande la plus récente, qui est postérieure à la date de commande déjà associée à la ligne. Le mot clé AS sert ici à créer un alias de table et ainsi permettre la comparaison des valeurs de la sous-requête à celles de la ligne active de la requête principale.

  9. Dans la quatrième colonne de la grille, dans 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 antérieure d’un produit déterminé, en utilisant la valeur de date antérieure que nous avons définie au moyen d’une sous-requête.

  1. Dans l'onglet Créer, cliquez sur Résultats dans le groupe Outils.

    La requête s’exécute et affiche une liste de noms de produits, de dates de commandes, de dates de commande antérieures, ainsi que l’intervalle entre les dates de commande. Les résultats sont triés d’abord en fonction de la référence produit (par ordre croissant), puis de la date de commande (par ordre décroissant).

    Remarque : Comme le champ Réf produit est un champ Liste de choix, Access affiche les valeurs de choix (dans ce cas, le nom de produit) et non les références produit proprement dites. Bien que cela ait un effet sur les valeurs affichées, cela ne modifie pas l’ordre de tri.

  2. Fermez la base de données Les Comptoirs.

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 de champ. Cela s’avère utile lorsque vous souhaitez utiliser les résultats de la sous-requête pour limiter les valeurs qui s’affichent dans 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 de connexion.

  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 commande pour les ajouter à la grille de conception de requête. Dans la table Employés, double-cliquez sur le champ Fonction pour l’ajouter à la grille de création de requête.

  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 des employés qui n’occupent pas une fonction de représentant commercial, et fournit ce jeu de résultats à la requête principale. Celle-ci détermine ensuite si les références employé de la table Commandes se trouvent 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 communs utilisables avec une sous-requête

Plusieurs mots clés SQL peuvent être utilisés 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 des 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.

    Par exemple, supposez que vous souhaitez analyser les données des étudiants d’une université. Les étudiants doivent avoir une moyenne générale minimale, qui varie d’une spécialisation à une autre. Les spécialisations et leur moyenne générale minimale sont stockées dans une table nommée Spécialisations, et les informations sur les étudiants sont stockées dans une table appelée Dossiers_Étudiants.

    Pour afficher la liste des spécialisations (et leur moyenne générale minimale) pour lesquelles chaque étudiant ayant opté pour l’une de ces spécialisations 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.

    Par exemple, supposez que vous souhaitez analyser les données des étudiants d’une université. Les étudiants doivent avoir une moyenne générale minimale, qui varie d’une spécialisation à une autre. Les spécialisations et leur moyenne générale minimale sont stockées dans une table nommée Spécialisations, et les informations sur les étudiants sont stockées dans une table appelée Dossiers_Étudiants.

    Pour afficher la liste des spécialisations (et leur moyenne générale minimale) pour lesquelles un étudiant ayant opté pour l’une de ces spécialisations n’a 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 la même optique ; le mot clé SOME est un synonyme de 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 figurent sur au moins une commande existante :

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

    Si vous utilisez NOT EXISTS, le requête renvoie une liste de produits qui ne figurent pas sur 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 la liste des commandes (avec leur date) qui ont été traitées par des employés non 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 de la façon suivante :

    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

Remarque : Avertissement traduction automatique : cet article a été traduit par un ordinateur, sans intervention humaine. Microsoft propose cette traduction automatique pour offrir aux personnes ne maîtrisant pas l’anglais l’accès au contenu relatif aux produits, services et technologies Microsoft. Comme cet article a été traduit automatiquement, il risque de contenir des erreurs de grammaire, de syntaxe ou de terminologie.

Ces informations vous ont-elles été utiles ?

Très bien ! Vous avez d’autres commentaires ?

Comment pouvons-nous l’améliorer ?

Nous vous remercions pour vos commentaires.

×