適用於: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 陳述式中所列每一欄的值都必須是唯一的。 例如,[員工] 資料表可能列有幾位姓氏相同的員工。 如果在 LastName 欄位中有兩筆記錄都包含 Smith,那麼 SQL 陳述式只會傳回一筆包含 Smith 的記錄:
SELECT DISTINCT LastName FROM Employees;
如果省略了 DISTINCT,這個查詢會把兩筆 Smith 記錄都傳回。 如果 SELECT 子句包含一個以上的欄位,若結果要包含指定的記錄,則所有欄位的值組合都必須是唯一的。 使用 DISTINCT 的查詢,其輸出無法更新,也不會反映其他使用者後來做的變更。
DISTINCTROW:省略以整個重複記錄為基礎的資料,而不只是重複的欄位。 例如,您可以建立一個查詢來聯結 CustomerID 欄位上的 Customers 和 Orders 資料表。 因為每位顧客可以有許多訂單,因此 [Customers] 資料表沒有重複的 [CustomerID] 欄位,而 [Orders] 欄位則有。 下列 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 名學生,而要班上最後 10% 的學生:
SELECT TOP 10 PERCENT FirstName, LastName FROM Students WHERE GraduationYear = 1994 ORDER BY GradePointAverage ASC;
ASC 述詞指定傳回最差值。 接在 TOP 後面的值必須是不帶正負號的整數。 TOP 並不影響查詢是否可以更新。
table:從中擷取記錄的資料表名稱。
範例
本範例會建立查詢,將 [Customers] 及 [Orders] 資料表以 [客戶識別碼] 欄位聯結。 因為每位顧客可以有許多訂單,因此 [Customers] 資料表沒有重複的 [CustomerID] 欄位,而 [Orders] 欄位則有。 使用 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
另請參閱
- 存取開發人員論壇
- 在 support.office.com 上存取說明
- 存取 UtterAccess 上的論壇
- 存取開發人員和 VBA 程式設計說明中心 (FMS)
- 存取 StackOverflow 上的文章
支援和意見反應
有關於 Office VBA 或這份文件的問題或意見反應嗎? 如需取得支援服務並提供意見反應的相關指導,請參閱 Office VBA 支援與意見反應。