Access 开发人员参考
|
ALL、DISTINCT、DISTINCTROW 和 TOP 谓词 (Microsoft Access SQL)
|
指定使用 SQL 查询选择的记录。
语法
Select [ALL | DISTINCT | DISTINCTROW | [TOP n [PERCENT]]] FROM table
包含这些谓词的 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 子句,查询将会从 Students 表中返回一个满足 Where 子句的包含 25 个记录的任意集合。
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
|