共用方式為


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 陳述式中所列每一欄的值都必須是唯一的。 例如,[員工] 資料表可能列有幾位姓氏相同的員工。 如果在 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 

另請參閱

支援和意見反應

有關於 Office VBA 或這份文件的問題或意見反應嗎? 如需取得支援服務並提供意見反應的相關指導,請參閱 Office VBA 支援與意見反應