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

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 (SQL) 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 active, ce qui n’est pas possible sans recourir à une sous-requête.

Par exemple, revenons à l’exemple où vous vouliez afficher l’intervalle entre les commandes de chacun de vos produits. Pour déterminer cet intervalle, vous devez comparer chaque date de commande aux autres dates de commande d’un produit déterminé. Vous pouvez créer une requête qui affiche ces informations en utilisant le modèle de base de données Les Comptoirs.

Procédure pour configurer Les Comptoirs

  1. Sous l’onglet Fichier, cliquez sur Nouveau.

  2. Sous Modèles disponibles, cliquez sur Exemples de modèles.

  3. Cliquez sur Les Comptoirs, puis sur Créer.

  4. Suivez les instructions fournies dans la page Les Comptoirs (sous l’onglet 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 Requêtes, cliquez sur Création de requête.

  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 :

    Date antérieure: (SELECT MAX([Date de commande]) 
    FROM [Commandes de produits] AS [Anciennes commandes]
    WHERE [Anciennes commandes].[Date de commande] < [Commandes de produits].[Date de commande]
    AND [Anciennes commandes].[Réf produit] = [Commandes de produits].[Réf produit])

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.

  1. Dans la quatrième colonne de la grille, dans la ligne Champ, tapez l’expression suivante :

    Intervalle : [Date de commande]-[Date antérieure]

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. Sous l'onglet Créer, dans le groupe Résultats, cliquez sur Exécuter.

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

    2. 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ères 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 la base de données 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é, Réf 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 [Employés] 
    WHERE [Fonction]<>'Représentant commercial')

    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 [Spécialisation], [MoyGén_Min] 
FROM [Spécialisations]
WHERE [MoyGén_Min] < ALL
(SELECT [MoyGén] FROM [Dossiers_Étudiants]
WHERE [Dossiers_Étudiants].[Spécialisation]=[Spécialisations].[Spécialisation]);
  • 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 appellé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 [Spécialisation], [MoyGén_Min] 
    FROM [Spécialisations]
    WHERE [MoyGén_Min] > ANY
    (SELECT [MoyGén] FROM [Dossiers_Étudiants]
    WHERE [Dossiers_Étudiants].[Spécialisation]=[Spécialisations].[Spécialisation]);

    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 [Produits]
    WHERE EXISTS
    (SELECT * FROM [Détails commande]
    WHERE [Détails commande].[Réf produit]=[Produits].[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 [Produits]
    WHERE NOT EXISTS
    (SELECT * FROM [Détails commande]
    WHERE [Détails commande].[Réf produit]=[Produits].[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 [Réf commande], [Date de commande]
    FROM [Commandes]
    WHERE [Réf employé] IN
    (SELECT [ID] FROM [Employés]
    WHERE [Fonction]<>'Représentant commercial')

    En utilisant NOT IN, vous pourriez écrire la même requête de la façon suivante :

    SELECT [Réf commande], [Date de commande]
    FROM [Commandes]
    WHERE [Réf employé] NOT IN
    (SELECT [ID] FROM [Employés]
    WHERE [Fonction]='Représentant commercial');

Haut de la page

Développez vos compétences
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.

×