Vous êtes sur la page 1sur 3

Sous-requêtes SQL (Microsoft Access SQL)

Office 2013 et versions ultérieures

Dernière modification :lundi 9 mars 2015

S’applique à :Access 2013 | Access 2016

Une sous-requête est une instruction SELECT imbriquée dans une instruction SELECT, SELECT…INTO,
INSERT…INTO, DELETE ou UPDATE ou imbriquée dans une autre sous-requête.

Syntaxe

Vous pouvez utiliser trois variantes de syntaxe pour créer une sous-requête :

comparaison [ANY | ALL | SOME] (instructionsql)

expression [NOT] IN (instructionsql)

[NOT] EXISTS (instructionsql)

Une sous-requête est composée des arguments suivants :

Argument Description
Expression et opérateur de comparaison qui compare l'expression avec les résultats de la sous-
comparaison
requête.
expression Expression pour laquelle le jeu de résultats de la sous-requête est recherchée.
Instruction SELECT respectant le même format et les mêmes règles que les autres instructions
instructionsql
SELECT. Elle doit figurer entre parenthèses.

Notes

Vous pouvez utiliser une sous-requête au lieu d’une expression, dans la liste de champs d’une instruction
WHERE ou dans une clause HAVING. Dans une sous-requête, vous utilisez une instruction SELECT pour
fournir un jeu d’une ou plusieurs valeurs spécifiques à évaluer dans l’expression de la clause WHERE ou
HAVING.

Utilisez les prédicats ANY ou SOME, qui sont synonymes, pour rechercher par comparaison les
enregistrements de la requête principale en correspondance avec n'importe quel enregistrement de la sous-
requête. Dans l'exemple suivant, la requête renvoie tous les produits dont le prix unitaire est supérieur au prix
de n'importe quel produit vendu avec une remise de 25 pour cent ou davantage :

SQL

SELECT * FROM Products


WHERE UnitPrice > ANY
(SELECT UnitPrice FROM OrderDetails
WHERE Discount >= .25);

Utilisez le prédicat ALL pour rechercher par comparaison uniquement les enregistrements de la requête
principale en correspondance avec n’importe quel enregistrement de la sous-requête. Si dans l’exemple
précédent, vous avez remplacé ANY par ALL, la requête ne renvoie que les produits dont le prix unitaire est
supérieur aux prix de tous les produits vendus avec une remise de 25 pourcent ou davantage. La recherche est
beaucoup plus restrictive.

Utilisez le prédicat IN pour rechercher les enregistrements de la requête principale pour lesquels on trouve des
enregistrements avec une valeur identique dans la sous-requête. Dans l'exemple suivant, la requête renvoie tous
les produits vendus avec une remise de 25 pour cent ou davantage :

SQL

SELECT * FROM Products


WHERE ProductID IN
(SELECT ProductID FROM OrderDetails
WHERE Discount >= .25);

À l'inverse, vous pouvez utiliser le prédicat NOT IN pour rechercher les enregistrements de la requête
principale pour lesquels aucun enregistrement avec une ne contient une valeur identique dans la sous-requête.

Utilisez le prédicat EXISTS (avec le mot réservé facultatif NOT) dans des comparaisons vrai/faux pour
déterminer si la sous-requête renvoie des enregistrements

Vous pouvez également utiliser des alias de nom de table dans une sous-requête pour faire référence à des
tables répertoriées dans une clause FROM en dehors de la sous-requête. Dans l’exemple suivant, la requête
renvoie le nom des employés dont le salaires est supérieur ou égal au salaire moyen de l’ensemble des
employés occupant le même poste. L’alias affecté à la table Employees est « T1 » :

SQL

SELECT LastName,
FirstName, Title, Salary
FROM Employees AS T1
WHERE Salary >= (SELECT Avg(Salary)
FROM Employees
WHERE T1.Title = Employees.Title) Order by Title;

Dans l'exemple précédent, le mot réservé AS est facultatif.

Certaines sous-requêtes sont autorisées dans les requêtes Analyse croisée mais uniquement comme prédicats
(ceux de la clause WHERE). Les sous-requêtes ne sont pas autorisées dans les requêtes Analyse croisée pour ce
qui concerne les sorties (dans la liste de SELECT)

Exemple

Dans cet exemple, le nom et le contact de chaque client ayant passé une commande au cours du second
trimestre de 1995 sont répertoriés.

Cet exemple appelle la procédure EnumFields que vous pouvez trouver dans l’exemple d’instruction SELECT.

VBA

Sub SubQueryX()
Dim dbs As Database, rst As Recordset

' Modify this line to include the path to Northwind


' on your computer.
Set dbs = OpenDatabase("Northwind.mdb")

' List the name and contact of every customer


' who placed an order in the second quarter of
' 1995.
Set rst = dbs.OpenRecordset("SELECT ContactName," _
& " CompanyName, ContactTitle, Phone" _
& " FROM Customers" _
& " WHERE CustomerID" _
& " IN (SELECT CustomerID FROM Orders" _
& " WHERE OrderDate Between #04/1/95#" _
& " And #07/1/95#);")

' Populate the Recordset.


rst.MoveLast

' Call EnumFields to print the contents of the


' Recordset. Pass the Recordset object and desired
' field width.
EnumFields rst, 25

dbs.Close

End Sub