次の方法で共有


LEFT JOIN 操作および RIGHT JOIN 操作 (Microsoft Access SQL)

適用先: Access 2013、Office 2013

FROM 句の中で使用され、ソース テーブルのレコードを結合します。

構文

FROM table1 [ LEFT |RIGHT ] JOIN table2 ON table1.field1compopr table2.field2

LEFT JOIN 操作および RIGHT JOIN 操作には、次の指定項目があります。

パーツ

説明

table1table2

結合するレコードのあるテーブルの名前。

field1field2

結合されるフィールドの名前。 フィールドは同じデータ型で、同じ種類のデータが含まれている必要がありますが、同じ名前を持つ必要はありません。

compopr

"="、"<"、">"、"<="、">="、"<>" などの比較演算子。

注釈

左外部結合を作成するには、LEFT JOIN 操作を使用します。 左外部結合では、結合する 2 つのテーブルのうち 2 番目 (右側) のテーブルに対応するレコードがなくても、1 番目 (左側) のテーブルのレコードがすべて追加されます。

右外部結合を作成するには、RIGHT JOIN 操作を使用します。 右外部結合では、結合する 2 つのテーブルのうち 1 番目 (左側) のテーブルに対応するレコードがなくても、2 番目 (右側) のテーブルのレコードがすべて追加されます。

たとえば、[部署] テーブル (左側) と [社員] テーブル (右側) がある場合に、どの部署にも所属しない社員も含めた全社員を選択するには、RIGHT JOIN 操作を使用します。 反対に、社員が配属されていない部署も含めたすべての部署を選択するには、LEFT JOIN 操作を使用します。

次の例では、Categories テーブルと Products テーブルを CategoryID フィールドで結合しています。 このクエリでは、商品がまったくない商品区分も含めて、すべての商品区分の一覧が出力されます。

SELECT CategoryName, 
ProductName 
FROM Categories LEFT JOIN Products 
ON Categories.CategoryID = Products.CategoryID;

この例では、CategoryID は結合フィールドですが、SELECT ステートメントで指定されていないため、クエリ結果には含まれません。 結合フィールドを含めるには、フォールド名 (この場合は Categories.CategoryID) を SELECT ステートメントに指定します。

注:

  • 結合フィールドのデータが同じレコードのみを選択するクエリを作成するには、INNER JOIN 操作を使用します。
  • LEFT JOIN または RIGHT JOIN は INNER JOIN 内に入れ子にすることができますが、INNER JOIN を LEFT JOIN または RIGHT JOIN 内に入れ子にすることはできません。 他の結合内で結合を入れ子にする方法については、INNER JOIN トピックの入れ子に関する説明を参照してください。
  • ON 句は複数連結できます。 詳細については、「INNER JOIN 操作」の連結に関する説明を参照してください。
  • メモまたは OLE オブジェクトのデータを含むフィールドを結合しようとすると、エラーが発生します。

この例

  • Employees テーブルに仮定の Department Name フィールドと Department ID フィールドが存在すると想定します。 実際には、Northwind データベースの Employees テーブルにこのフィールドは含まれていないので注意してください。

  • 社員が配属されていない部署も含めてすべての部署を選択します。

  • SELECT ステートメントの使用例を見つけることができるEnumFields プロシージャを呼び出します。

    Sub LeftRightJoinX() 
     
        Dim dbs As Database, rst As Recordset 
     
        ' Modify this line to include the path to Northwind 
        ' on your computer. 
        Set dbs = OpenDatabase("Northwind.mdb") 
         
        ' Select all departments, including those  
        ' without employees. 
        Set rst = dbs.OpenRecordset _ 
            ("SELECT [Department Name], " _ 
            & "FirstName & Chr(32) & LastName AS Name " _ 
            & "FROM Departments LEFT JOIN Employees " _ 
            & "ON Departments.[Department ID] = " _ 
            & "Employees.[Department ID] " _ 
            & "ORDER BY [Department Name];") 
         
        ' 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