ALL、DISTINCT、DISTINCTROW、top 谓词 (Microsoft Access SQL)

适用于:Access 2013 | Access 2016

指定使用 SQL 查询选择的记录。

语法

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

包含这些谓词的 SELECT 语句包含以下部分。

  • ALL:如果未包含谓词之一,则假定为 。 Microsoft Access 数据库引擎会选择符合 SQL 语句中的条件的所有记录。

    以下两个示例是等价的,它们都返回 Employees 表中的所有记录:

      SELECT ALL * 
      FROM Employees 
      ORDER BY EmployeeID; 
    
    
      SELECT * 
      FROM Employees 
      ORDER BY EmployeeID;
    
  • DISTINCT:省略所选字段中包含重复数据的记录。 若要包括在查询的结果中,在 SELECT 语句中所列出的每个字段的值必须是唯一的。 例如,Employees 表中列出的一些雇员可能有相同的名字 (LastName)。 如果在 LastName 字段中有两个包含 Smith 的记录,则下面的 SQL 语句只返回一个包含 Smith 的记录:

      SELECT DISTINCT 
      LastName 
      FROM Employees;
    

    如果忽略了 DISTINCT,这个查询将返回两个 Smith 记录。 如果 SELECT 子句包含多个字段,若要在结果中包含给定的记录,那么所有字段的值的组合必须是唯一的。 使用 DISTINCT 查询的输出结果是不可更新的,它不会影响其他用户所做的后续更改。

  • DISTINCTROW:基于整个重复记录(而不仅仅是重复字段)省略数据。 例如,创建一个联接顾客表和订单表的 CustomerID 字段的查询。 Customers 表不包含重复的 CustomerID 字段,但是 Orders 表包含重复的 CustomerID 字段,因为每一个客户可以有多个订单。 下面的 SQL 语句显示了如何使用 DISTINCTROW 产生一个至少有一个订单但没有这些订单任何细节的公司列表:

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

    如果忽略了 DISTINCTROW,对于每个有多个订单的公司这个查询语句将得到多个行。 DISTINCTROW 仅在选择的字段源于查询中所使用的表的一部分而不是全部时才会生效。 如果查询仅包含一个表或者要从所有的表中输出字段,DISTINCTROW 就会被忽略。

  • TOP n [PERCENT]:返回一定数量的记录,这些记录位于 ORDER BY 子句指定的范围的顶部或底部。 假定希望得到 1994 年级中前 25 名学生的名字:

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

    如果未包含 ORDER BY 子句,查询将从 Student 表中返回一组任意的 25 条记录,这些记录满足 WHERE 子句。 TOP 谓词不会在两个相等的值中进行选择。 在上面的示例中,如果第 25 和第 26 名的年级平均分相同,那么查询将会返回 26 个记录。 也可以使用 PERCENT 保留字返回出现在 ORDER BY 子句指定的起始和结束范围内的某个百分比数量的记录。 假如,您希望返回该年级中最后名次的百分之十个学生,而不是前 25 名学生:

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

    ASC 谓词指定返回最小值。 TOP 之后的值必须是无符号整数。 TOP 谓词不影响查询是否可更新。

  • table:从中检索记录的表的名称。

示例

以下示例创建一个通过 CustomerID 字段联接 Customers 表和 Orders 表的查询。 Customers 表不包含重复的 CustomerID 字段,但是 Orders 表包含重复的 CustomerID 字段,因为每一个客户可以有多个订单。 使用 DISTINCTROW 生成至少有一个订单的公司的列表,但不包含有关这些订单的任何详细信息。

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 

另请参阅

支持和反馈

有关于 Office VBA 或本文档的疑问或反馈? 请参阅 Office VBA 支持和反馈,获取有关如何接收支持和提供反馈的指南。