Share via


ALL, DISTINCT, DISTINCTROW, TOP prédicats (Microsoft Access SQL)

S’applique à : Access 2013 | Access 2016

Spécifie les enregistrements sélectionnés avec des requêtes SQL.

Syntaxe

SELECT [ALL | DISTINCT | DISTINCTROW | [TOP n [PERCENT]]] TABLE FROM

Une instruction SELECT contenant ces prédicats comporte les éléments suivants.

  • ALL : si vous n’incluez pas l’un des prédicats. Le moteur de base de données Microsoft Access sélectionne tous les enregistrements qui remplissent les conditions dans l'instruction SQL.

    Les deux exemples suivants sont équivalents et renvoient tous les enregistrements de la table Employees :

      SELECT ALL * 
      FROM Employees 
      ORDER BY EmployeeID; 
    
    
      SELECT * 
      FROM Employees 
      ORDER BY EmployeeID;
    
  • DISTINCT : omet les enregistrements qui contiennent des données en double dans les champs sélectionnés. Pour être incluses dans les résultats de la requête, les valeurs de chaque champ indiqué dans l'instruction SELECT doivent être uniques. Par exemple, il peut arriver que plusieurs employés répertoriés dans la table Employees aient le même nom. Si deux enregistrements contiennent Dupont dans le champ LastName, l'instruction SQL suivante ne renvoie qu'un seul enregistrement contenant Dupont :

      SELECT DISTINCT 
      LastName 
      FROM Employees;
    

    Si vous ne spécifiez pas DISTINCT, cette requête renvoie les deux enregistrements contenant Dupont. Si la clause SELECT contient plusieurs champs, la combinaison des valeurs de tous les champs doit être unique pour qu'un enregistrement puisse être inclus dans les résultats. Le résultat d'une requête qui utilise DISTINCT n'est pas modifiable et ne reflète pas les différentes modifications effectuées par d'autres utilisateurs.

  • DISTINCTROW : omet les données basées sur des enregistrements en double entiers, et pas seulement sur des champs en double. Par exemple, vous pouvez créer une requête qui joint les tables Customers (Clients) et Orders (Commandes) sur le champ CustomerID. La table Customers ne contient pas de champ CustomerID en double, contrairement à la table Orders, car il peut y avoir plusieurs commandes pour chaque client. L'instruction SQL suivante indique la manière d'utiliser DISTINCTROW pour produire une liste de sociétés qui ont passé au moins une commande mais sans fournir aucun détail sur ces commandes :

      SELECT DISTINCTROW CompanyName 
      FROM Customers INNER JOIN Orders 
      ON Customers.CustomerID = Orders.CustomerID 
      ORDER BY CompanyName;
    

    Si vous ne spécifiez pas DISTINCTROW, cette requête produit plusieurs lignes pour chaque société qui a passé plusieurs commandes. DISTINCTROW n'est efficace que lorsque vous sélectionnez des champs dans certaines tables utilisées dans la requête, mais pas dans toutes. DISTINCTROW est ignoré si votre requête n'inclut qu'une seule table ou si vous sélectionnez des champs dans toutes les tables.

  • TOP n [PERCENT] : retourne un certain nombre d’enregistrements qui se trouvent en haut ou en bas d’une plage spécifiée par une clause ORDER BY. Supposons, par exemple, que vous voulez les noms des 25 meilleurs étudiants de la promotion 1994 :

      SELECT TOP 25 
      FirstName, LastName 
      FROM Students 
      WHERE GraduationYear = 1994 
      ORDER BY GradePointAverage DESC;
    

    Si vous n’incluez pas la clause ORDER BY, la requête retourne un jeu arbitraire de 25 enregistrements de la table Students qui satisfont à la clause WHERE. Le prédicat TOP ne choisit pas entre des valeurs égales. Dans l'exemple précédent, si le vingt-cinquième et le vingt-sixième étudiants ont le même nombre de points, la requête retourne 26 enregistrements. Vous pouvez également utiliser le mot réservé PERCENT pour renvoyer un certain pourcentage d'enregistrements qui apparaissent au début ou à la fin d'une plage spécifiée par une clause ORDER BY. Supposons, à présent, qu'au lieu des 25 meilleurs étudiants, vous voulez les 10 pour cents ayant les moins bons résultats de la promotion :

      SELECT TOP 10 PERCENT 
      FirstName, LastName 
      FROM Students 
      WHERE GraduationYear = 1994 
      ORDER BY GradePointAverage ASC;
    

    Le prédicat ASC spécifie les valeurs les plus basses. La valeur qui suit TOP doit être un entier non signé. TOP n'a aucun effet sur le fait de pouvoir modifier ou non la requête.

  • table : nom de la table à partir de laquelle les enregistrements sont récupérés.

Exemple

Dans cet exemple, une requête joignant les tables Customers et Orders sur le champ CustomerID est créée. La table Customers ne contient pas de champ CustomerID en double, contrairement à la table Orders, car il peut y avoir plusieurs commandes pour chaque client. L'utilisation de DISTINCTROW dans la requête permet de produire une liste des sociétés qui ont passé au moins une commande mais sans fournir aucun détail sur ces commandes.

Sub AllDistinctX() 
    Dim dbs As Database, rst As Recordset 
    ' Modify this line to include the path to Northwind 
    ' on your computer. 
    Set dbs = OpenDatabase("Northwind.mdb") 
   
    ' Join the Customers and Orders tables on the  
    ' CustomerID field. Select a list of companies  
    ' that have at least one order. 
 
    Set rst = dbs.OpenRecordset("SELECT DISTINCTROW " _ 
        & "CompanyName FROM Customers " _ 
        & "INNER JOIN Orders " _ 
        & "ON Customers.CustomerID = " _ 
        & "Orders.CustomerID " _ 
        & "ORDER BY CompanyName;") 
 
    ' 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 

Voir aussi

Assistance et commentaires

Avez-vous des questions ou des commentaires sur Office VBA ou sur cette documentation ? Consultez la rubrique concernant l’assistance pour Office VBA et l’envoi de commentaires afin d’obtenir des instructions pour recevoir une assistance et envoyer vos commentaires.