ALL、DISTINCT、DISTINCTROW、TOP 述語 (Microsoft Access SQL)

適用先: Access 2013 | Access 2016

SQL クエリで選択されたレコードを指定します。

構文

[すべての|] を選択しますDISTINCT |DISTINCTROW |[TOP n [PERCENT]]]FROM テーブル

これらの述語を含む SELECT ステートメントには、次の部分があります。

  • ALL: 述語の 1 つを含めない場合に想定されます。 Microsoft Access データベース エンジンは、SQL ステートメントの条件を満たすすべてのレコードを選択します。

    次の 2 つの例は同等であり、Employees テーブルからすべてのレコードを返します。

      SELECT ALL * 
      FROM Employees 
      ORDER BY EmployeeID; 
    
    
      SELECT * 
      FROM Employees 
      ORDER BY EmployeeID;
    
  • DISTINCT: 選択したフィールドに重複データを含むレコードを省略します。 SELECT ステートメントに指定した各フィールドの値をクエリの結果に含めるには、それらの値が一意である必要があります。 たとえば、同姓同名の複数の社員が登録されている Employees テーブルがあるとします。 このテーブルで、LastName フィールドに "山田次郎" を含むレコードが 2 つある場合、次の SQL ステートメントは "山田次郎" を含むレコードを 1 つだけ返します。

      SELECT DISTINCT 
      LastName 
      FROM Employees;
    

    DISTINCT を指定しないと、"山田次郎" を含むレコードが 2 つとも返されます。 SELECT 句に複数のフィールドを指定する場合、すべてのフィールドの値の組み合わせが一意であるレコードだけがクエリ結果に含まれます。 DISTINCT を使用するクエリの結果は更新できません。他のユーザーが結果を変更しても反映されません。

  • DISTINCTROW: 重複フィールドだけでなく、重複レコード全体に基づいてデータを除外します。 たとえば、CustomerID フィールドの Customers テーブルと Orders テーブルを結合するクエリを作成できます。 Customers テーブルでは CustomerID フィールドの重複はありませんが、それぞれの得意先は複数の注文を出すため、Orders テーブルでは CustomerID が重複します。 次の SQL ステートメントは、DISTINCTROW を使用して、少なくとも 1 つの注文があるが、それらの注文に関する詳細がない企業の一覧を生成する方法を示しています。

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

    DISTINCTROW を指定しないと、複数回注文した得意先について、注文の回数に応じて複数の行が作成されます。 DISTINCTROW は、クエリで使用するすべてのテーブルからではなく、その一部のテーブルからフィールドを選択した場合にのみ有効です。 クエリに含まれるテーブルが 1 つだけの場合、またはすべてのテーブルからフィールドを出力する場合、DISTINCTROW は無視されます。

  • TOP n [PERCENT]: ORDER BY 句で指定された範囲の一番上または一番下にある特定の数のレコードを返します。 たとえば、1994 年度のクラスのうち上位 25 番の成績の生徒の名前を表示するには、次のような SQL ステートメントを記述します。

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

    ORDER BY 句を含めない場合、クエリは WHERE 句を満たす Students テーブルから任意の 25 レコードセットを返します。 TOP 述語を指定した場合、同じ値を持つレコードをすべて選択します。 たとえば、上記の例で、25 番目の生徒と 26 番目の生徒の成績が同じであれば、26 個のレコードが返されます。 予約語 PERCENT を使用すると、上位または下位での一定のパーセンテージのレコードを返すこともできます。 次の例では、上位 25 番以内ではなく、クラスの上位 10 % の生徒を選択しています。

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

    ASC 述語を指定すると、昇順で値が返されます。 TOP の後に指定する値は、符号なし整数型 (Integer) である必要があります。 TOP を指定しても、クエリの更新には関係ありません。

  • table: レコードの取得元となるテーブルの名前。

次の使用例では、CustomerID フィールドに基づいて Customers テーブルと Orders テーブルを結合するクエリを作成します。 Customers テーブルでは CustomerID フィールドの重複はありませんが、それぞれの得意先は複数の注文を出すため、Orders テーブルでは CustomerID が重複します。 DISTINCTROW を使用すると、少なくとも 1 回は注文を出したことのある得意先の一覧が生成されますが、個々の注文の詳細は示されません。

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 のサポートおよびフィードバックを参照してください。