適用先: Access 2013、Office 2013
共通のフィールドで一致する値があるたびに、2 つのテーブルからレコードを結合します。
構文
FROM table1 INNER JOIN table2ON table1。field1compopr table2。field2
INNER JOIN 操作には、次の指定項目があります。
パーツ |
説明 |
---|---|
table1、table2 |
結合するレコードのあるテーブルの名前。 |
field1、field2 |
結合されるフィールドの名前。 数値でない場合、フィールドは同じデータ型で、同じ種類のデータが含まれている必要がありますが、同じ名前を持つ必要はありません。 |
compopr |
"="、"<"、">"、"<="、">="、"<>" などの比較演算子。 |
注釈
INNER JOIN 操作は、FROM 句の中で使用します。 INNER JOIN 操作は最も一般的な結合方法です。 2 つのテーブルの共通するフィールドに同じ種類の値があった場合に、両方のテーブルのレコードを結合します。
たとえば、[部署] テーブルと [社員] テーブルで INNER JOIN 操作を行うと、各部署に所属する社員全員を選択できます。 これに対して、所属する社員が 1 人もいない部署も含めすべての部署を選択したり、どの部署にも所属していない社員も含め社員全員を選択したりするには、LEFT JOIN または RIGHT JOIN 操作を使用して外部結合を作成します。
メモ型 (Memo) または OLE オブジェクト型 (OLE Object) のデータが格納されたフィールドを結合しようとすると、エラーが発生します。
2 つの数値型 (Numeric) フィールドのデータ型が同じであれば、それらのフィールドを結合することができます。 たとえば、オートナンバ型 (AutoNumber) フィールドと長整数型 (Long) フィールドは、データ型が同じであるため結合することができます。 一方、単精度浮動小数点型 (Single) フィールドと倍精度浮動小数点型 (Double) フィールドは結合できません。
次の例では、Categories テーブルと Products テーブルを CategoryID フィールドで結合しています。
SELECT CategoryName, ProductName
FROM Categories INNER JOIN Products
ON Categories.CategoryID = Products.CategoryID;
上記の例では、CategoryID は結合フィールドですが、SELECT ステートメントには含まれていないため、クエリ出力には含まれていません。 結合フィールドを含めるには、SELECT ステートメントにフィールド名 (この場合は Categories.CategoryID) を含めます。
次の構文を使用して、複数の ON 句を JOIN ステートメントでリンクすることもできます。
TABLE1 INNER JOIN table2 ON table1 の SELECT フィールド。field1compoprtable2。field1AND table1。field2compoprtable2。field2OR table1。field3compoprtable2。field3;
次の構文を使用して、JOIN ステートメントを入れ子にすることもできます。
SELECT fields FROM table1 INNER JOIN (table2 INNER JOIN [( ]table3 [INNER JOIN [( ]tablex [INNER JOIN ...)] ON table3。field3compoprtablex。fieldx)]ON table2。field2compoprtable3。field3)ON table1。field1compoprtable2。field2;
LEFT JOIN または RIGHT JOIN は、INNER JOIN の入れ子にすることができますが、INNER JOIN は LEFT JOIN または RIGHT JOIN の入れ子にすることはできません。
例
次の使用例では、Order Details テーブルと Orders テーブルの等結合、および Orders テーブルと Employees テーブルの等結合を作成します。 この結合が必要になるのは、Employees テーブルに売上データが含まれず、Order Details テーブルに社員データが含まれないためです。 クエリによって、社員名と、その社員の総売上高の一覧が生成されます。
この例では、EnumFields プロシージャを呼び出します。EnumFields プロシージャについては、SELECT ステートメントの使用例を参照してください。
Sub InnerJoinX()
Dim dbs As Database, rst As Recordset
' Modify this line to include the path to Northwind
' on your computer.
Set dbs = OpenDatabase("Northwind.mdb")
' Create a join between the Order Details and
' Orders tables and another between the Orders and
' Employees tables. Get a list of employees and
' their total sales.
Set rst = dbs.OpenRecordset("SELECT DISTINCTROW " _
& "Sum(UnitPrice * Quantity) AS Sales, " _
& "(FirstName & Chr(32) & LastName) AS Name " _
& "FROM Employees INNER JOIN(Orders " _
& "INNER JOIN [Order Details] " _
& "ON [Order Details].OrderID = " _
& "Orders.OrderID ) " _
& "ON Orders.EmployeeID = " _
& "Employees.EmployeeID " _
& "GROUP BY (FirstName & Chr(32) & LastName);")
' Populate the Recordset.
rst.MoveLast
' Call EnumFields to print the contents of the
' Recordset. Pass the Recordset object and desired
' field width.
EnumFields rst, 20
dbs.Close
End Sub