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 <token>TE000126768</token>.

Vous pouvez écrire une sous-requête dans une <token>TE000127167</token> ou dans une instruction SQL (Structured Query Language) en <token>TE000126761</token>.

Contenu de cet article

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#bm1">Utiliser les résultats d’une requête en tant que champ dans une autre requête</link>

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#bm2">Utiliser une sous-requête en tant que critère pour un champ de requête</link>

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#bm3">Mots clés SQL fréquents utilisables avec une sous-requête</link>

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. Utilisez une sous-requête en tant qu'alias de champ 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.

  1. Sous l’onglet <ui>Fichier</ui>, cliquez sur <ui>Nouveau</ui>.

  2. Sous <ui>Modèles disponibles</ui>, cliquez sur <ui>Exemples de modèles</ui>.

  3. Cliquez sur <ui>Northwind</ui>, puis sur <ui>Créer</ui>.

  4. Suivez les instructions fournies dans la page <ui>Les Comptoirs </ui> (sous l’onglet objet <ui>Écran Démarrage</ui>) pour ouvrir la base de données, puis fermez la fenêtre Boîte de dialogue de connexion.

  5. Sous l’onglet <ui>Créer</ui>, dans le groupe <ui>Requêtes</ui>, cliquez sur <ui>Création de requête</ui>.

  6. Dans la boîte de dialogue <ui>Afficher la table </ui>, cliquez sur l’onglet <ui>Requêtes </ui>, puis double-cliquez sur <ui>Commandes de produits</ui>.

  7. Fermez la boîte de dialogue <ui>Afficher la table</ui>.

  8. Double-cliquez sur le champ <ui>Réf produit</ui> et sur le champ <ui>Date de commande</ui> pour les ajouter à la grille de création de requête.

  9. Dans la ligne <ui>Trier</ui> de la colonne <ui>Réf produit</ui> de la grille, sélectionnez <ui>Croissant</ui>.

  10. Dans la ligne <ui>Trier</ui> de la colonne <ui>Date de commande</ui> de la grille, sélectionnez <ui>Décroissant</ui>.

  11. Dans la troisième colonne de la grille, cliquez avec le bouton droit sur la ligne <ui>Champ</ui>, puis cliquez sur <ui>Zoom</ui> dans le menu contextuel.

  12. Dans la boîte de dialogue <ui>Zoom</ui>, 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.

  13. Dans la quatrième colonne de la grille, dans la ligne <ui>Champ</ui>, tapez l’expression suivante :

    <codeInline>Interval: [Order Date]-[Prior Date]</codeInline>

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

  14. Sous l’onglet <ui>Création</ui>, dans le groupe <ui>Résultats</ui>, cliquez sur <ui>Exécuter</ui>.

    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.

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

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#__top">Haut de la page</link>

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

Vous pouvez utiliser une sous-requête comme critère de champ. Utilisez une sous-requête comme critère de champ lorsque vous souhaitez utiliser les résultats de la sous-requête pour limiter les valeurs affichées par 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<legacyItalic> </legacyItalic>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.accdb et activez son contenu.

  2. Fermez le formulaire de connexion.

  3. Sous l’onglet <ui>Créer</ui>, dans le groupe <ui>Autre</ui>, cliquez sur <ui>Création de requête</ui>.

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

  5. Fermez la boîte de dialogue <ui>Afficher la table</ui>.

  6. Dans la table Commandes, double-cliquez sur les champs <ui>Réf employé</ui>, <ui>N° commande</ui> et <ui>Date de commande</ui> pour les ajouter à la grille de conception de requête. Dans la table Employés, double-cliquez sur le champ <ui>Fonction</ui> pour l’ajouter à la grille de création de requête.

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

  8. Dans la zone <ui>Zoom</ui>, 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 <ui>Créer</ui>, dans le groupe <ui>Résultats</ui>, cliquez sur <ui>Exécuter</ui>.

    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.

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#__top">Haut de la page</link>

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.

  • <embeddedLabel>ALL</embeddedLabel> 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]);
  • <embeddedLabel>ANY</embeddedLabel> 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.

  • <embeddedLabel>EXISTS</embeddedLabel> 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]);
  • <embeddedLabel>IN</embeddedLabel> 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');

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#__top">Haut de la page</link>

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.

×